都是二進制有啥不能轉? 編譯器才無論呢,你說這4Bytes 是地址就是地址,你說是數值就是數值函數
int a = 66; //66 = 0x42 printf("該平臺指針類型大小是%ld\n",sizeof(&a)); printf("該平臺INT類型大小是%ld\n",sizeof(a)); printf("%p\n",&a);//輸出整形變量a的地址,0x7ffeefbff5fc, 0x7ffeefbff5fc 0x7ffeefbff5fb 0x7ffeefbff5fa 0x7ffeefbff5f9 這4個字節一塊兒存儲了ox42. 由於C語言的棧空間的分配是方向從高地址到低地址的
int a = 10; spa
int *p = &a;操作系統
當咱們定義一個變量的時候到底發生了什麼?指針
操做系統會在內存堆(malloc)或者棧分配必定大小的連續空間來存儲變量的值(對於指針變量就是存儲另一個變量的地址)code
這裏的變量a和p 就是這一塊連續地址的首地址的別名,就像ip地址和域名的關係,域名只是ip地址的別名而已.ip
a存儲是10,p存儲的是a的地址.內存
在函數內部如何改變外部普通變量(非指針變量)的值?編譯器
int a = 66; //從0x7ffeefbff5fc開始分配了連續4個字節的內存空間,存儲66(十進制表示),0x7ffeefbff5fc是首地址 int *addr1 = &a; //二級指針 int **addr2 = &addr1; printf("%p\n", &addr2); //輸出0x7ffeefbff5e8,這是addr2的內存地址(酒店房間的門牌號,房間裏面放着addr1的地址) printf("%p\n", *addr2); //輸出0x7ffeefbff5fc,addr2存儲的是addr1的內存地址(*就是取房間裏放的地址牌) printf("%p\n", **addr2);//輸出0x42
&變量名
就是取變量在內存中的首地址(普通變量和指針變量都是如此)域名
*指針變量的變量名
就是取這個指針變量所存儲的內容(多是地址,也多是值)編譯
指針變量纔有 取* 操做,普通變量是沒有的, 能夠屢次進行 取*操做,順藤摸瓜 !
在函數內部改變 外部指針變量 的「指向」? 答案就是二級指針.
int x = 5; int y = 10; void change_addr_value(int **p) { *p = &y; } int *addr3 ; addr3 = &x; printf("value=%d\n",*addr3); change_addr3_value(&addr3); printf("value=%d\n",*addr3);