對於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 的值作為地址)的那個空間的值。