Programming with Pointers
description
Transcript of Programming with Pointers
![Page 1: Programming with Pointers](https://reader033.fdocuments.us/reader033/viewer/2022052308/56814e87550346895dbc2268/html5/thumbnails/1.jpg)
1
Programming with Pointers
Turgay Korkmaz
Office: SB 4.01.13 Phone: (210) 458-7346
Fax: (210) 458-4437 e-mail: [email protected]
web: www.cs.utsa.edu/~korkmaz
CS 2073Computer Programming
w/Eng. Applications Ch 6
![Page 2: Programming with Pointers](https://reader033.fdocuments.us/reader033/viewer/2022052308/56814e87550346895dbc2268/html5/thumbnails/2.jpg)
2
6.1 Addresses and Pointers Recall memory concepts from Ch2
1 = 00000001
7 = 00000111
? = arbitrary 1’s and 0’s
0
1
2
3
4
5
6
…
x1
x2
distance
addressname Memory - content
int x1=1, x2=7;
double distance;
![Page 3: Programming with Pointers](https://reader033.fdocuments.us/reader033/viewer/2022052308/56814e87550346895dbc2268/html5/thumbnails/3.jpg)
3
6.1 Addresses and Pointers
int a, b;int *c, *d;a = 5;c = &a;d = &b;*d = 9;print c, *c, &cprint a, b
?
?
?
?
memory
0
1
2
3
4
a
b
c
addressname
c=1 *c=5 &c=3
a=5 b=9
5
1
d 2
9
![Page 4: Programming with Pointers](https://reader033.fdocuments.us/reader033/viewer/2022052308/56814e87550346895dbc2268/html5/thumbnails/4.jpg)
4
Address Operator
A variable can be referenced using the address operator &
&a in previous example means address of aprintf(“%i”, &a); will print 1printf(“%i”, a); will print 5
![Page 5: Programming with Pointers](https://reader033.fdocuments.us/reader033/viewer/2022052308/56814e87550346895dbc2268/html5/thumbnails/5.jpg)
5
Pointer Assignment A pointer is a variable that holds the address
of a memory location If a variable p holds the address of another
variable q, then p is said to point to q If q is a variable at location 100 in memory,
then p would have the value 100 (q’s address)
![Page 6: Programming with Pointers](https://reader033.fdocuments.us/reader033/viewer/2022052308/56814e87550346895dbc2268/html5/thumbnails/6.jpg)
6
How to declare a pointer variable pointer variables are declared using an asterisk ( * ) The
asterisk is called the indirection operator or the de-referencing operator).
example:
int a, b, *ptr; ptr is a pointer to an integer when a pointer is defined, the type of variable to which
it will point must be specified. (i.e. a pointer defined to point to an integer cannot also point to a floating point variable.)
![Page 7: Programming with Pointers](https://reader033.fdocuments.us/reader033/viewer/2022052308/56814e87550346895dbc2268/html5/thumbnails/7.jpg)
7
Example
int *iPtr;double *dPtr;
the variable iPtr is declared to point to an int the variable dPtr is declared to point to a double neither variable has not been initialized in the above
example declaring a pointer creates a variable capable of
holding an address Addresses are integers!
![Page 8: Programming with Pointers](https://reader033.fdocuments.us/reader033/viewer/2022052308/56814e87550346895dbc2268/html5/thumbnails/8.jpg)
8
Example
?
?
?
iPtr
s
dPtr
-
int a, *iPtr;char *s;double *dPtr;
iPtr = &a;
?a
![Page 9: Programming with Pointers](https://reader033.fdocuments.us/reader033/viewer/2022052308/56814e87550346895dbc2268/html5/thumbnails/9.jpg)
9
More about declaring pointers
When using the form
int *p, q;the * operator does not distribute.
In the above example p is declared to be a pointer to int. q is declared to be an int.
![Page 10: Programming with Pointers](https://reader033.fdocuments.us/reader033/viewer/2022052308/56814e87550346895dbc2268/html5/thumbnails/10.jpg)
10
Assigning values to a pointer the assignment operator (=) is defined for pointers
the right operand can be any expression that evaluates to the same type as the left
the operator & in front of an ordinary variable produces the address of that variable. The & operator is called to address of operator
![Page 11: Programming with Pointers](https://reader033.fdocuments.us/reader033/viewer/2022052308/56814e87550346895dbc2268/html5/thumbnails/11.jpg)
11
Example
int i=6, j;
int *iPtr;
iPtr = &i;j = *iPtr;
6
?
i
j
iPtr
6
![Page 12: Programming with Pointers](https://reader033.fdocuments.us/reader033/viewer/2022052308/56814e87550346895dbc2268/html5/thumbnails/12.jpg)
12
Exercise
Give a memory snapshot after each set of assignment statements
int a=1, b=2, *ptr;ptr = &b;a = *ptr;*ptr = 5;
a
b
ptr
![Page 13: Programming with Pointers](https://reader033.fdocuments.us/reader033/viewer/2022052308/56814e87550346895dbc2268/html5/thumbnails/13.jpg)
13
NULL pointer
A pointer can be assigned or compared to the integer zero, or, equivalently, to the symbolic constant NULL, which is defined in <stdio.h>.
A pointer variable whose value is NULL is not pointing to anything that can be accessed
![Page 14: Programming with Pointers](https://reader033.fdocuments.us/reader033/viewer/2022052308/56814e87550346895dbc2268/html5/thumbnails/14.jpg)
14
Example
iPtr
s
dPtr
int *iPtr=0;char *s=0;double *dPtr=NULL;
![Page 15: Programming with Pointers](https://reader033.fdocuments.us/reader033/viewer/2022052308/56814e87550346895dbc2268/html5/thumbnails/15.jpg)
15
Pointer AssignmentsA pointer can point to only one location at a time, but several pointers can point to the same location.
/* Declare and initialize variables. */int x=-5, y = 8, *ptr1, *ptr2;/* Assign both pointers to point to x. */ptr1 = &x;ptr2 = ptr1;
The memory snapshot after these statements are executed is
ptr1 ptr2
x y-5 8
![Page 16: Programming with Pointers](https://reader033.fdocuments.us/reader033/viewer/2022052308/56814e87550346895dbc2268/html5/thumbnails/16.jpg)
16
Skip: Pointer Arithmetic Four arithmetic operations are supported
+, -, ++, -- only integers may be used in these operations
Arithmetic is performed relative to the variable type being pointed to
Example: p++; if p is defined as int *p, p will be incremented by 4 (system
dependent) if p is defined as double *p, p will be incremented by 8(system
dependent when applied to pointers, ++ means increment pointer to point to
next value in memory
![Page 17: Programming with Pointers](https://reader033.fdocuments.us/reader033/viewer/2022052308/56814e87550346895dbc2268/html5/thumbnails/17.jpg)
17
Comparing Pointers You may compare pointers using relational operators Common comparisons are:
check for null pointer (p == NULL) check if two pointers are pointing to the same object
� (p == q) Is this equivalent to � (*p == *q)
compare two pointers that are pointing to a common object such as an array.
![Page 18: Programming with Pointers](https://reader033.fdocuments.us/reader033/viewer/2022052308/56814e87550346895dbc2268/html5/thumbnails/18.jpg)
18
Exercise
int x=2, y=5, temp;int *ptr1, *ptr2, *ptr3;
// make ptr1 point to x ptr1 = &x;
// make ptr2 point to y ptr2 = &y;
Show the memory snapshot after the following operations
2
x
5
y
?
temp
ptr1 ptr2 ptr3
![Page 19: Programming with Pointers](https://reader033.fdocuments.us/reader033/viewer/2022052308/56814e87550346895dbc2268/html5/thumbnails/19.jpg)
19
Exercise
// swap the contents of
// ptr1 and ptr2
ptr3 = ptr1;
ptr1 = ptr2;
ptr2 = ptr3;
Show the memory snapshot after the following operations
2
x
5
y
?
temp
ptr1 ptr2 ptr3
![Page 20: Programming with Pointers](https://reader033.fdocuments.us/reader033/viewer/2022052308/56814e87550346895dbc2268/html5/thumbnails/20.jpg)
20
Exercise
// swap the values pointed
// by ptr1 and ptr2
temp = *ptr1;
*ptr1 = *ptr2;
*ptr2 = temp;
Show the memory snapshot after the following operations
5
x
2
y
5
temp
ptr1 ptr2 ptr3
![Page 21: Programming with Pointers](https://reader033.fdocuments.us/reader033/viewer/2022052308/56814e87550346895dbc2268/html5/thumbnails/21.jpg)
21
6.2 Pointers and Arrays The name of an array is the address of the first elements (i.e. a pointer
to the first element) The array name is a constant that always points to the first element of
the array and its value can not be changed. Array names and pointers may often be used interchangeably.Example
int num[4] = {1,2,3,4}, *p;p = num;/* above assignment is the same as p = &num[0]; */printf(“%i”, *p); // print num[0]p++;printf(“%i”, *p); // print num[1]
![Page 22: Programming with Pointers](https://reader033.fdocuments.us/reader033/viewer/2022052308/56814e87550346895dbc2268/html5/thumbnails/22.jpg)
22
Pointers and Arrays (cont’d) You can also index a pointer using array notation
char string[] = “This is a string”;
char *str;
int i;
str = string;
for(i =0; str[i]; i++) //look for null
printf(“%c”, str[i]);
![Page 23: Programming with Pointers](https://reader033.fdocuments.us/reader033/viewer/2022052308/56814e87550346895dbc2268/html5/thumbnails/23.jpg)
23
Skip: Two Dimensional Arrays•A two-dimensional array is stored in sequential memory
locations, in row order.Array definition: int s[2][3] = {{2,4,6}, {1,5,3}}, *sptr=&s; Memory allocation:
s[0][0] 2 s[0][1] 4s[0][2] 6s[1][0] 1s[1][1] 5s[1][2] 3
A pointer reference to s[0][1] would be *(sptr+1)A pointer reference to s[1][1] would be *(sptr+4)
row offset * number of columns + column offset
![Page 24: Programming with Pointers](https://reader033.fdocuments.us/reader033/viewer/2022052308/56814e87550346895dbc2268/html5/thumbnails/24.jpg)
24
Exercise
Study Section 6.3 from the textbook
![Page 25: Programming with Pointers](https://reader033.fdocuments.us/reader033/viewer/2022052308/56814e87550346895dbc2268/html5/thumbnails/25.jpg)
25
6.4 Pointers in Function References In C, function references are call-by-value
except when an array name is used as an argument.
An array name is the address of the first element Values in an array can be modified by statements
within a function To modify a function argument, a pointer to the
argument must be passed scanf(“%f”, &X); This statement specifies that the
value read is to be stored at the address of The actual parameter that corresponds to a
pointer argument must be an address or pointer.
![Page 26: Programming with Pointers](https://reader033.fdocuments.us/reader033/viewer/2022052308/56814e87550346895dbc2268/html5/thumbnails/26.jpg)
26
Call by Valuevoid swap(int a, int b){ int temp;
temp = a; a = b; b = temp; return;}
![Page 27: Programming with Pointers](https://reader033.fdocuments.us/reader033/viewer/2022052308/56814e87550346895dbc2268/html5/thumbnails/27.jpg)
27
Call by Value
int x = 2, y = 3;
printf("X = %d Y = %d\n",x,y);
swap(x,y);
printf("X = %d Y = %d\n",x,y);
Changes made in function swap are lost when the function execution is over
![Page 28: Programming with Pointers](https://reader033.fdocuments.us/reader033/viewer/2022052308/56814e87550346895dbc2268/html5/thumbnails/28.jpg)
28
Call by referencevoid swap2(int *aptr, int *bptr){ int temp;
temp = *aptr; *aptr = *bptr; *bptr = temp;
return;}
![Page 29: Programming with Pointers](https://reader033.fdocuments.us/reader033/viewer/2022052308/56814e87550346895dbc2268/html5/thumbnails/29.jpg)
29
Call by referenceint x = 2, y = 3;int *ptr1, *ptr2;
swap2(&x, &y);printf("X = %d Y = %d\n",x, y);
x = 2; y = 3;ptr1 = &x;ptr2 = &y;swap2(ptr1,ptr2);printf("X = %d Y = %d\n",*ptr1,*ptr2);
![Page 30: Programming with Pointers](https://reader033.fdocuments.us/reader033/viewer/2022052308/56814e87550346895dbc2268/html5/thumbnails/30.jpg)
30
Exercise Write a function to compute the roots of quadratic
equation ax^2+bx+c=0. How to return two roots?
void comproots(int a,int b,int c,
double *dptr1, double *dptr2)
{
*dptr1 = (-b - sqrt(b*b-4*a*c))/(2.0*a);
*dptr2 = (-b + sqrt(b*b-4*a*c))/(2.0*a);
return;
}
![Page 31: Programming with Pointers](https://reader033.fdocuments.us/reader033/viewer/2022052308/56814e87550346895dbc2268/html5/thumbnails/31.jpg)
31
Exercise cont’dint a,b,c;double root1,root2;
printf("Enter Coefficients:\n");scanf("%d%d%d",&a,&b,&c);
computeroots(a,b,c,&root1,&root2);
printf("First Root = %lf\n",root1);printf("Second Root = %lf\n",root2);
![Page 32: Programming with Pointers](https://reader033.fdocuments.us/reader033/viewer/2022052308/56814e87550346895dbc2268/html5/thumbnails/32.jpg)
32
Skip
Study section 6.5 from the textbook
We studied section 6.6 Strings under one dimensional char arrays in ch 5
![Page 33: Programming with Pointers](https://reader033.fdocuments.us/reader033/viewer/2022052308/56814e87550346895dbc2268/html5/thumbnails/33.jpg)
33
6.7 Dynamic Memory Allocation
Dynamically allocated memory is determined at runtime
A program may create as many or as few variables as required, offering greater flexibility
Dynamic allocation is often used to support data structures such as stacks, queues, linked lists and binary trees.
Dynamic memory is finite Dynamically allocated memory may be freed during
execution
![Page 34: Programming with Pointers](https://reader033.fdocuments.us/reader033/viewer/2022052308/56814e87550346895dbc2268/html5/thumbnails/34.jpg)
34
Dynamic Memory Allocation
Memory is allocated using the: malloc function (memory allocation) calloc function (cleared memory allocation)
Memory is released using the: free function
The size of memory requested by malloc or calloc can be changed using the: realloc function
![Page 35: Programming with Pointers](https://reader033.fdocuments.us/reader033/viewer/2022052308/56814e87550346895dbc2268/html5/thumbnails/35.jpg)
35
malloc and calloc•Both functions return a pointer to the newly allocated memory
•If memory can not be allocated, the value returned will be a NULL value
•The pointer returned by these functions is declared to be a void pointer
•A cast operator should be used with the returned pointer value to coerce it to the proper pointer type
![Page 36: Programming with Pointers](https://reader033.fdocuments.us/reader033/viewer/2022052308/56814e87550346895dbc2268/html5/thumbnails/36.jpg)
36
Example of malloc and calloc
int n = 6, m = 4;double *x;int *p;
/* Allocate memory for 6 doubles. */x = (double *)malloc(n*sizeof(double));
/* Allocate memory for 4 integers. */p = (int *)calloc(m,sizeof(int));
X
p
![Page 37: Programming with Pointers](https://reader033.fdocuments.us/reader033/viewer/2022052308/56814e87550346895dbc2268/html5/thumbnails/37.jpg)
37
Skip
Study Section 6.8* (optional)
![Page 38: Programming with Pointers](https://reader033.fdocuments.us/reader033/viewer/2022052308/56814e87550346895dbc2268/html5/thumbnails/38.jpg)
38
Examples
![Page 39: Programming with Pointers](https://reader033.fdocuments.us/reader033/viewer/2022052308/56814e87550346895dbc2268/html5/thumbnails/39.jpg)
39
Trace a programmain(){ int x[3] = {5, 2, 3}; int i; void swap(int *a, int *b); for(i=0; i < 2; i++){ swap(&x[i], &x[i+1]); } for(i=0; i < 3; i++){ printf(“%d \n”, x[i]); } }void swap(int *a, int *b){
int tmp; tmp = *a; *a = *b; *b = tmp; return;}
name Addr Value
x[0] 1
x[1] 2
x[2] 3
i 4
5
6
a 7
b 8
tmp 9
![Page 40: Programming with Pointers](https://reader033.fdocuments.us/reader033/viewer/2022052308/56814e87550346895dbc2268/html5/thumbnails/40.jpg)
40
Trace a programmain(){ int x, y; max_min(4, 3, 5, &x, &y); printf(“ First: %d %d”, x, y); max_min(x, y, 2, &x, &y); printf(“Second: %d %d”, x, y);}void max_min(int a, int b, int c, int *max, int *min){ *max = a; *min = a; if (b > *max) *max = b; if (c > *max) *max = c; if (b < *min) *min = b; if (c < *min) *min = c;}
name Addr Value
x 1
y 2
3
4
5
a 6
b 7
c 8
max 9
min 10