c語言 &取地址運算符的理解


對於c語言中的&運算符,百度百科是這樣定義的:(&p)則是這樣一種運算,返回當時聲明p 時開辟的地址;但是根據我對代碼的觀察,我覺得&運算符不只是返回地址的功能;

例如:

int a = 1;
//假設a的地址是0x7dfe88
int *p = (int *)0x7dfe88;

int num = 1;
int *p1 = #

以上是一段簡單的給指針p,p1賦值的代碼,0x7dfe88是一段單純的十六進制地址,但是當地址轉指針的時候卻必須加上強轉(int *);如果不加強轉,那么編譯器就會提出警告( warning C4047: “初始化”:“int *”與“int”的間接級別不同);但是使用&運算符取地址的時候卻不需要加任何強轉就能編譯通過,說明&運算符絕不是的獲取地址那么簡單,“=”賦值運算符的運算順勛是從右向左,說明"="的右邊也是一個指針,所以在此假設&運算符會取出num的地址,並且根據num的類型生成一個臨時的指針。

根據假設,寫出如下代碼驗證:

int num = 1;
double *p1 = #

結果編譯器報“ warning C4133: “初始化”: 從“int *”到“double *”的類型不兼容”錯誤。所以我的假設有一定的道理。

 

綜上所述:

(&p)則是這樣一種運算,返回一個指針,該指針的值是當時聲明p 時開辟的地址,指針的類型是p的類型對應的指針類型。(只是本人自己觀點)

 

 

通過對指針&運算符的理解,我認為*運算符在某些情況下(例如二級指針)同樣有將一個地址轉化成指針的功能。

例子:

int num = 1;
int *p = #
int **p1 = &p;
int *p2 = *p1;

如果將int *p2 = *p1;替換成double *p2 = *p1;,那么編譯器會警告: warning C4133: “初始化”: 從“int *”到“double *”的類型不兼容

所以(*p)操作是這樣一種運算,獲取指針p的值(變量的地址)找到對應的變量的值-----返回以(p 的值作為地址)的那個空間的值。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM