C Pointers ======================================================================================= CIS-Linux2:~/2012/c/ptrs>more pointer1.c /* "&" is the "address of" operator, "*" is the "thing pointed to by" operator #include main() { int i; int *pi; /* *pi is an int */ i = 10; pi = &i; /* pi points to i */ printf("%8.8x\n", i); /* printed 0000000a */ printf("%8.8x\n", *pi); /* printed 0000000a */ printf("%8.8x\n", pi); /* printed 8a205dac */ } CIS-Linux2:~/2012/c/ptrs>gcc pointer1.c CIS-Linux2:~/2012/c/ptrs>./a.out 0000000a 0000000a 8a205dac CIS-Linux2:~/2012/c/ptrs> ====================================================================================== CIS-Linux2:~/2012/c/ptrs>more pointer2.c #include main() { int i, j, k, l; int *pi, *pj, *pk, *pl; /* *pi is an int */ i = 16, j=32, k=48, l=64; pi = &i, pj = &j, pk = &k, pl = &l; /* pi points to i */ printf(" i=%8.8x j=%8.8x k=%8.8x l=%8.8x\n", i, j, k, l); printf(" pi=%8.8x pj=%8.8x pk=%8.8x pl=%8.8x\n", pi, pj, pk, pl); printf(" *pi=%8.8x *pj=%8.8x *pk=%8.8x *pl=%8.8x\n", *pi, *pj, *pk, *pl); } CIS-Linux2:~/2012/c/ptrs>gcc pointer2.c CIS-Linux2:~/2012/c/ptrs>./a.out i=00000010 j=00000020 k=00000030 l=00000040 pi=e03bda9c pj=e03bda98 pk=e03bda94 pl=e03bda90 *pi=00000010 *pj=00000020 *pk=00000030 *pl=00000040 CIS-Linux2:~/2012/c/ptrs> ====================================================================================== CIS-Linux2:~/2012/c/ptrs>more pointer3.c /* C always passes copies of arguments to functions */ #include void exch(int, int); main() { int i, j; i = 16, j=32; printf(" i=%8.8x j=%8.8x\n", i, j); exch(i, j); printf(" i=%8.8x j=%8.8x\n", i, j); } void exch(int i, int j) { int temp; temp = i; i = j; j = temp; } CIS-Linux2:~/2012/c/ptrs>gcc pointer3.c CIS-Linux2:~/2012/c/ptrs>./a.out i=00000010 j=00000020 i=00000010 j=00000020 ====================================================================================== CIS-Linux2:~/2012/c/ptrs>more pointer4.c /* Exchanging copies of the pointers isn't going to work either */ #include void exch(int *, int *); main() { int i, j; i = 16, j=32; printf(" i=%8.8x j=%8.8x\n", i, j); exch(&i, &j); printf(" i=%8.8x j=%8.8x\n", i, j); } void exch(int *pi, int *pj) { int *ptemp; ptemp = pi; pi = pj; pj = ptemp; } CIS-Linux2:~/2012/c/ptrs>gcc pointer4.c CIS-Linux2:~/2012/c/ptrs>./a.out i=00000010 j=00000020 i=00000010 j=00000020 CIS-Linux2:~/2012/c/ptrs> ====================================================================================== CIS-Linux2:~/2012/c/ptrs>more pointer5.c /* This blows up, but why? */ #include void exch(int *, int *); main() { int i, j; i = 16, j=32; printf(" i=%8.8x j=%8.8x\n", i, j); exch(&i, &j); printf(" i=%8.8x j=%8.8x\n", i, j); } void exch(int *pi, int *pj) { int *ptemp; *ptemp = *pi; *pi = *pj; *pj = *ptemp; } CIS-Linux2:~/2012/c/ptrs>gcc pointer5.c CIS-Linux2:~/2012/c/ptrs>./a.out i=00000010 j=00000020 i=00000020 j=00000010 Segmentation fault CIS-Linux2:~/2012/c/ptrs> ====================================================================================== CIS-Linux2:~/2012/c/ptrs>more pointer6.c /* Finally, either of the following functions will work */ #include void exch(int *, int *); void exchv2(int *, int *); main() { int i, j; i = 16, j=32; printf(" i=%8.8x j=%8.8x\n", i, j); exch(&i, &j); printf(" i=%8.8x j=%8.8x\n", i, j); } void exch(int *pi, int *pj) { int temp; temp = *pi; *pi = *pj; *pj = temp; } void exchv2(int *pi, int *pj) { // using unneeded pointer to store the int int temp, *ptemp; ptemp = &temp; *ptemp = *pi; *pi = *pj; *pj = *ptemp; } CIS-Linux2:~/2012/c/ptrs>gcc pointer6.c CIS-Linux2:~/2012/c/ptrs>./a.out i=00000010 j=00000020 i=00000020 j=00000020 CIS-Linux2:~/2012/c/ptrs> ====================================================================================== CIS-Linux2:~/2012/c/ptrs>more pointer7.c /* Or, if you like, you can exchange pointers */ #include void exch(int **, int **); main() { int i, j; int *pi, *pj; i = 16, j=32; pi = &i, pj=&j; printf(" i=%8.8x j=%8.8x\n", i, j); printf(" pi=%8.8x pj=%8.8x\n", pi, pj); printf(" *pi=%8.8x *pj=%8.8x\n", *pi, *pj); exch(&pi, &pj); printf(" i=%8.8x j=%8.8x\n", i, j); printf(" pi=%8.8x pj=%8.8x\n", pi, pj); printf(" *pi=%8.8x *pj=%8.8x\n", *pi, *pj); } void exch(int **ppi, int **ppj) { int *ptemp; ptemp = *ppi; *ppi = *ppj; *ppj = ptemp; } CIS-Linux2:~/2012/c/ptrs>gcc pointer7.c CIS-Linux2:~/2012/c/ptrs>./a.out i=00000010 j=00000020 pi=5311c98c pj=5311c988 *pi=00000010 *pj=00000020 i=00000010 j=00000020 pi=5311c988 pj=5311c98c *pi=00000020 *pj=00000010 CIS-Linux2:~/2012/c/ptrs> ======================================================================================