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