#include int main(void) { int result, z=3, y=2, x=0; int * ptrC, * ptrB, * ptrA; printf("\nSize of x: %d, size of ptrA: %d\n", sizeof(x), sizeof(ptrA)); /*what if we would write "int * ptrC, ptrB, ptrA;" instead? */ printf("\nRight before line: \"ptrA = &x;\" is executed\n"); printf("Address of x: %p, y: %p, z: %p, result: %p\n", &x, &y, &z, &result); printf("Content of x: %d, y: %d, z: %d, result: %d\n", x, y, z, result); printf("Address of ptrA: %p, ptrB: %p, ptrC: %p\n", &ptrA, &ptrB, &ptrC); printf("Content of ptrA: %p, ptrB: %p, ptrC: %p\n", ptrA, ptrB, ptrC); ptrA = &x; printf("\nRight before line: \"x++;\" is executed\n"); printf("Address of x: %p, y: %p, z: %p, result: %p\n", &x, &y, &z, &result); printf("Content of x: %d, y: %d, z: %d, result: %d\n", x, y, z, result); printf("Address of ptrA: %p, ptrB: %p, ptrC: %p\n", &ptrA, &ptrB, &ptrC); printf("Content of ptrA: %p, ptrB: %p, ptrC: %p\n", ptrA, ptrB, ptrC); x++;//i.e. x = x + 1 printf("\nRight before line: \"ptrA++;\" is executed\n"); printf("Address of x: %p, y: %p, z: %p, result: %p\n", &x, &y, &z, &result); printf("Content of x: %d, y: %d, z: %d, result: %d\n", x, y, z, result); printf("Address of ptrA: %p, ptrB: %p, ptrC: %p\n", &ptrA, &ptrB, &ptrC); printf("Content of ptrA: %p, ptrB: %p, ptrC: %p\n", ptrA, ptrB, ptrC); ptrA++; printf("\nRight before line: \"result=*ptrA++;\" is executed\n"); printf("Address of x: %p, y: %p, z: %p, result: %p\n", &x, &y, &z, &result); printf("Content of x: %d, y: %d, z: %d, result: %d\n", x, y, z, result); printf("Address of ptrA: %p, ptrB: %p, ptrC: %p\n", &ptrA, &ptrB, &ptrC); printf("Content of ptrA: %p, ptrB: %p, ptrC: %p\n", ptrA, ptrB, ptrC); result = *ptrA++;/* IMPORTANT to know what is done first! */ printf("\nRight before line: \"ptrB = ptrA-2;\" is executed\n"); printf("Address of x: %p, y: %p, z: %p, result: %p\n", &x, &y, &z, &result); printf("Content of x: %d, y: %d, z: %d, result: %d\n", x, y, z, result); printf("Address of ptrA: %p, ptrB: %p, ptrC: %p\n", &ptrA, &ptrB, &ptrC); printf("Content of ptrA: %p, ptrB: %p, ptrC: %p\n", ptrA, ptrB, ptrC); ptrB = ptrA - 2; printf("\nRight before line: \"ptrC = &(*ptrA);\" is executed\n"); printf("Address of x: %p, y: %p, z: %p, result: %p\n", &x, &y, &z, &result); printf("Content of x: %d, y: %d, z: %d, result: %d\n", x, y, z, result); printf("Address of ptrA: %p, ptrB: %p, ptrC: %p\n", &ptrA, &ptrB, &ptrC); printf("Content of ptrA: %p, ptrB: %p, ptrC: %p\n", ptrA, ptrB, ptrC); ptrC = &(*ptrA);/*the result is the same as ptrC=ptrA */ printf("\nRight before line: \"*(ptrA--) = 7;\" is executed\n"); printf("Address of x: %p, y: %p, z: %p, result: %p\n", &x, &y, &z, &result); printf("Content of x: %d, y: %d, z: %d, result: %d\n", x, y, z, result); printf("Address of ptrA: %p, ptrB: %p, ptrC: %p\n", &ptrA, &ptrB, &ptrC); printf("Content of ptrA: %p, ptrB: %p, ptrC: %p\n", ptrA, ptrB, ptrC); *(ptrA--) = 7;// TRICKY! printf("\nRight before line: \"*(--ptrA) = 9;\" is executed\n"); printf("Address of x: %p, y: %p, z: %p, result: %p\n", &x, &y, &z, &result); printf("Content of x: %d, y: %d, z: %d, result: %d\n", x, y, z, result); printf("Address of ptrA: %p, ptrB: %p, ptrC: %p\n", &ptrA, &ptrB, &ptrC); printf("Content of ptrA: %p, ptrB: %p, ptrC: %p\n", ptrA, ptrB, ptrC); *(--ptrA) = 9;// TRICKY! printf("\nRight before line: \"ptrB = (int *) &ptrA;\" is executed\n"); printf("Address of x: %p, y: %p, z: %p, result: %p\n", &x, &y, &z, &result); printf("Content of x: %d, y: %d, z: %d, result: %d\n", x, y, z, result); printf("Address of ptrA: %p, ptrB: %p, ptrC: %p\n", &ptrA, &ptrB, &ptrC); printf("Content of ptrA: %p, ptrB: %p, ptrC: %p\n", ptrA, ptrB, ptrC); ptrB = (int *) &ptrA;// IMPORTANT /* ptrB = &ptrA; generates a warning: assignment from incompatible pointer type */ printf("\nRight before line: \"ptrC = (int *) *ptrB;\" is executed\n"); printf("Address of x: %p, y: %p, z: %p, result: %p\n", &x, &y, &z, &result); printf("Content of x: %d, y: %d, z: %d, result: %d\n", x, y, z, result); printf("Address of ptrA: %p, ptrB: %p, ptrC: %p\n", &ptrA, &ptrB, &ptrC); printf("Content of ptrA: %p, ptrB: %p, ptrC: %p\n", ptrA, ptrB, ptrC); printf("NOTE: Now, we can use *ptrB, to get ADDRESS of variable x. SEE: *ptrB: %p\n", *ptrB); ptrC = (int *) *ptrB;// IMPORTANT /* ptrC = *ptrB; generates a warning: assignment makes pointer from integer without a cast */ printf("\nRight before line: \"return(0);\" is executed\n"); printf("Address of x: %p, y: %p, z: %p, result: %p\n", &x, &y, &z, &result); printf("Content of x: %d, y: %d, z: %d, result: %d\n", x, y, z, result); printf("Address of ptrA: %p, ptrB: %p, ptrC: %p\n", &ptrA, &ptrB, &ptrC); printf("Content of ptrA: %p, ptrB: %p, ptrC: %p\n", ptrA, ptrB, ptrC); printf("NOTE: Now, we can use *ptrC, to get CONTENT of variable x. SEE: *ptrC: %d\n", *ptrC); return(0); }