完全理解指針與二級指針

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

int *p = &a;操作系統

當咱們定義一個變量的時候到底發生了什麼?指針

操做系統會在內存堆(malloc)或者棧分配必定大小的連續空間來存儲變量的值(對於指針變量就是存儲另一個變量的地址)code

這裏的變量a和p 就是這一塊連續地址的首地址的別名,就像ip地址和域名的關係,域名只是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);
相關文章
相關標籤/搜索