Start Lecture #8
The next few sections present some simple examples using pointers. Several were written in class with the students.
#include <stdio.h> int x, *p; int main () { p = &x; x = 12; printf ("p = %d\n", p); p++; printf ("p = %d\n", p); printf ("*p = %d\n", *p); }
The example on the right illustrates well the difference between a variable, in this case x, and its address &x. The first value printed is the address of x. This is not 12. Instead it is (probably) some large number.
A compiler warning occurs since in (modern) C, integers (%d) and pointers (&x) are not the same type.
Incrementing p does not increment x. Instead, the result is that p points to the next integer after x. In this program there is no further integer after x, so the result is unpredictable. If, instead of x, we had p point to A[7] for some integer array A, then the last line would have printed the value of A[8] and the penultimate line would have printed the address of A[8].
include <stdio.h> int mystrlen (char *s); int main () { char stg[] = "hello"; printf ("The string %s has %d characters\n", stg, mystrlen(stg)); } int mystrlen (char *s) { int i; for (i = 0; s[i] != '\0'; i++); return i; }
#include <stdio.h> int mystrlen (char s[]); int main () {} // unchanged int mystrlen (char s[]) { int i = 0; while (*s++ != '\0') i++; return i; }
On the right we show two versions of the string length function: The first version uses array notation for the string; the second uses pointer notation. The main() program is identical in the two versions so is shown only once. Note how very close the two string length functions are; another illustration of the similarity of arrays and pointers in C.
In the second version we encounter a common C idiom *s++. First note that the precedence of the operators is such that *s++ is the same as *(s++). That is, we are moving (incrementing) the pointer and examining what it now points at. We are not incrementing a part of the string. Specifically, we are not executing (*s)++;
Note that the two declarations
int mystrlen (char *s) int mystrlen (char s[])are the same. They are used 4 times in the two versions of string length.
Changing any of them to the other form does not change the meaning of the program.
#include <stdio.h> int changeltox (char*); int main () { char stg[] = "hello"; changeltox (stg); printf ("The string is now %s\n", stg); } int changeltox (char *s) { while (*s != '\0') { if (*s == 'l') *s = 'x'; s++; } }
The program on the right simply loops through the input string and replaces each occurence of l with x.
The while loop and increment of s could have been combined into a for loop. This version is written in pointer style.
Homework: Rewrite changeltox() to use array style and a for loop.