徹底理解指標與二級指標
阿新 • • 發佈:2019-05-30
1.啥 ! int 可以強轉為 int* !
都是二進位制有啥不能轉? 編譯器才不管呢,你說這4Bytes 是地址就是地址,你說是數值就是數值
2.內部地址到底是啥?
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語言的棧空間的分配是方向從高地址到低地址的
3.變數名的本質
int a = 10;
int *p = &a;
當我們定義一個變數的時候到底發生了什麼?
作業系統會在記憶體堆(malloc)或者棧分配一定大小的連續空間來儲存變數的值(對於指標變數就是儲存另外一個變數的地址)
這裡的變數a和p 就是這一塊連續地址的首地址的別名,就像ip地址和域名的關係,域名只是ip地址的別名而已.
a儲存是10,p儲存的是a的地址.
4.一級指標
在函式內部如何改變外部普通變數(非指標變數)的值?
5.二級指標
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);