c - Printing address a pointer points to, value the address points to, and the address of the pointer itself -
i wrote little program familiarize myself pointers , relations between them little more. in order wrote small piece of code declares , initializes integer a
, declares pointer *p
address of a
, goes on deeper assign pointer pointer *pp
, on far ****pppp
. if understood pointers correctly pointer pointer ... works this:
address of pointer (or integer) itself: 0x7fff08d1c658 0x7fff08d1c660 0x7fff08d1c668 0x7fff08d1c670 0x7fff08d1c67c ↑ ↑ ↑ ↑ ↑ pppp --> ppp --> pp --> p --> = 42 ↓ ↓ ↓ ↓ address pointer points to: 0x7fff08d1c660 0x7fff08d1c668 0x7fff08d1c670 0x7fff08d1c67c
the addresses on diagonal have identical because previous pointer points address of next pointer has been assigned. want check in program using printf()
calls , here unsure if way print address more elaborate pointers **pp
, ***ppp
, , ****pppp
point , how print addresses of these pointers correct. point out possible mistakes? here code followed output:
#include <stdio.h> #include <stdlib.h> int main() { int a; int *p; int **pp; int ***ppp; int ****pppp; = 42; /* take address of */ p = &a; /* take address of p */ pp = &p; /* take address of pp */ ppp = &pp; /* take address of ppp */ pppp = &ppp; printf("address of int &a: %p\n", &a); printf("value of a: %d\n\n", a); printf("address p points via (void *)p: %p\n", (void *)p); printf("value *p points via *p: %d\n", *p); printf("address of *p via (void *)&p: %p\n\n", (void *)&p); printf("address pp points via (void *)pp: %p\n", (void *)pp); printf("value **pp points via **pp: %d\n", **pp); printf("address of **pp via (void *)&pp: %p\n\n", (void *)&pp); printf("address ppp points via (void *)ppp: %p\n", (void *)ppp); printf("value ***ppp points via ***ppp: %d\n", ***ppp); printf("address of ***ppp via (void *)&ppp: %p\n\n", (void *)&ppp); printf("address pppp points via (void *)pppp: %p\n", (void *)pppp); printf("value ****pppp points via ****pppp: %d\n", ****pppp); printf("address of ****pppp via (void *)&pppp: %p\n", (void *)&pppp); return exit_success; }
output:
address of int &a: 0x7fff08d1c67c value of a: 42 address p points via (void *)p: 0x7fff08d1c67c value *p points via *p: 42 address of *p via (void *)&p: 0x7fff08d1c670 address pp points via (void *)pp: 0x7fff08d1c670 value **pp points via **pp: 42 address of **pp via (void *)&pp: 0x7fff08d1c668 address ppp points via (void *)ppp: 0x7fff08d1c668 value ***ppp points via ***ppp: 42 address of ***ppp via (void *)&ppp: 0x7fff08d1c660 address pppp points via (void *)pppp: 0x7fff08d1c660 value ****pppp points via ****pppp: 42 address of ****pppp via (void *)&pppp: 0x7fff08d1c658
your code correct: understand printf
prints value of pointers %p
conversion specifier. actual output implementation specific can parsed pointer value scanf
same %p
specifier.
there 1 small detail got wrong in printf("address of int &a: %p\n", &a);
: pointers should converted void *
when passed printf
value convert %p
specifier. reason subtle: on architectures, pointers different types may have different representation, including different size, , may passed printf
in different way. converting pointer void *
ensures passed in form , manner expected printf
function.
this conversion not automatic printf
takes variable number of arguments of different types, these arguments passed in manner specific vararg
functions: instance float
values converted , passed double
, various pointer types not converted void *
, must write conversion explicitly (void *)
cast.
examples of architectures different pointer representations tend less popular nowadays, older programmers may remember days of near
, far
pointers , various memory models function , data pointers had different size.
Comments
Post a Comment