Pointer A variable that represent the location (rather than value) of a data item, such as variable or an array element It is used to pass information back and forth between function and its reference point It provides a way to return multiple data items from a function via function arguments It also permits references to other functions to be specified as arguments to the given function
Pointer It is closely associated with arrays and therefore provide an alternate way to access individual array elements. It provides a convenient way to represent multidimensional arrays
Fundamentals If a data item occupies one or more contiguous memory cells, the data can be accessed if we know the location of of the first memory cell. If v is a data item, then the address of its location can be determined by &v (here & is address operator) We can assign this address into another variable pv=&v This new variable pv is pointer to v, since it points to the location of v
Fundamentals The relationship between pv and v is pv v Data item represented by v can be accessed by expression *pv, where * is called indirection operator. (v=*pv) If we write pv=&v and u=*pv, the value of v is indirectly assigned to u Address of v Value of v
Example int u=3, v, *pu, *pv; pu=&u; v=*pu; pv=&v; Address EC7 Address F8E pu u Address EC5 Address F8C pvv F8E3 F8C3
Example Int v=3,*pv,u1,u2; u1=2*(v+5) pv=&v; u2=2*(*pv+5); Pointer variable can be assigned the value of another pointer variable (i.e pv=pu); Pointer variable can point to another pointer variable int *p,*u,v=3; u=&v; p=&u; **p is 3;
Example Pointer variable can be assigned a null (zero) value, then it points nowhere pu=0 Ordinary variables cannot be assigned arbitrary addresses &x=F8C is not permitted Data type of the pointer must be the same as the data type of the object data.
Passing pointer to a function Passing arguments by reference (or by address or by location) funct(int *,int *); main() { funct(&u,&v); } funct(int *p, int *q) { *p=0; *q=0; }
Problems Analyzing a line of text (count no. of vowels, consonants, digits, whites paces & other characters) Swapping two variables Coordinate change from Cartesian to polar Square root of a quadratic equation
Why & is required in scanf? char item[20]; int partno; float cost; scanf(“%s %d %f”,item, &itemno, &cost); Since item is the name of an array, it is understood to represent an address and does not require & & is required for itemno and partno in order to access the addresses of these variables rather than its values
Passing a portion of an array main () { float z[100]; process(&z[50]);//or process(z+50); } void process(float f[])// or void process(float *f) { } Here 50 element of z (z[50] to z[99]) will be available in the process. If f[0] is changed, then z[50] will be affected.
Returning pointer to the caller double *scan(double z[]); main() { double z[100],*pz; pz=scan(z); } double *scan(double f[]) { double *pf; pf=… return pf; }
Pointers and one-dimensional arrays int x[10]={10,11,12,13,14,15}; suppose the address of x is 72. here x[2] means 12 *(x+2) means 12 &x[2] means 76 x+2 means 76 We can not write x++ or &x[2]=&x[1] If a numerical array is defined as a pointer variable, the array element cannot be assigned initialized values
Pointers and one-dimensional arrays But a character-type pointer variable can be assigned an entire string as a part of the variable declaration. Thus, a string can be represented either by a one-dimensional character array: char x[]=“This is a string”; or a character pointer. char *x=“This is a string”;
Dynamic memory allocation We can represent an array in terms of a pointer variable and allocate memory block for the array dynamically (during the runtime of the program on the basis of user’s requirement) int *x; x=(int *) malloc (10*sizeof(int)); Or scanf(“%d”,&n); x=(int *) malloc (n*sizeof(int)); Example: sorting a list of numbers.
Pointers and multidimensional arrays A multidimensional array can be represented by a lower-dimensional array of pointers int x[10][20]; is same as int (*x)[20]; here x points to the first row (or first array of 20 element), x+1 points to the second 20 element array and so on. x[2][5] is same as *(*(x+2)+5)
Pointers and multidimensional arrays int (*x)[20] means pointer to array of integers. Here is no. of rows is variable, but no. of column is fixed int *x[20] means array of pointer to integers. Here is no. of column is variable, but no. of row is fixed. Here x[2][5] is equivalent to *(x[2]+5).