1. 程式人生 > >徹底理解指標與二級指標

徹底理解指標與二級指標

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);