C語言中的*和&符號
之前對*和&符號一直理解的比較淺顯。只知道:
*p好像表示的是一個指標;
&p表示的是一個地址。
然而這次當遇到了下面這個情況的時候:
int a = 10;
int *b = &a;
printf(“%d\n”, a);
printf(“%d\n”, &a);
printf(“%d\n”, b);
printf(“%d\n”, *b);
結果:
10
6487620
6487620
10
一臉懵逼,為什麼&a和*b的值不是一樣?這才發現自己其實一點都沒有搞懂。
經過學習後,總結出來:
變數a 本質上代表一個儲存單元。CPU通過該儲存單元的地址訪問該儲存單元中的資料。所以a本來代表兩個值:儲存單元的地址和儲單元中的資料。於是就有了二異性。為了消除這種二義性,C語言規定a表示儲存單元中的資料,&a表示儲存單元的地址。
a儲存單元中的資料可以是一個普通數值,也可以是另一個儲存單元的地址,比如:a = &b; 語句就是將b的儲存單元的地址存入a儲存單元中。C語言規定*a代表a中儲存的地址對應的儲存單元中的資料,也就是訪問*a就等於訪問b,於是*a提供了通過a訪問b中的資料的手段。
a表示a對應的儲存單元中的資料。
&a表示a對應的儲存單元的地址。
*a表示:首先,要求a對應的儲存單元中的資料一定是另一個儲存單元的地址。
於是,*a表示另一個儲存單元中的資料。
當a宣告的型別是int時,a中儲存的是一個整數數值,通過a可以訪問(讀取或修改)這個數值。
當a宣告的型別是int*時,a中儲存的是一個儲存單元的地址,而該儲存單元中儲存的資料是一個整數數值;通過*a可以訪問(讀取或修改)這個數值。a == &*a 都是該儲存單元的地址。
當a宣告的型別是int**時,a中儲存的是一個儲存單元的地址,而該儲存單元中儲存的資料是另外一個儲存單元的地址,另外這個儲存單元中儲存的是一個整數數值;通過**a可以訪問(讀取或修改)這個數值。
…
最後,在C語言裡地址叫指標。還有,在C語言中的陣列本質上其實也是指標,即:*a 等同於 a[]。
相關文章
- 對C語言中無符號型別的建議C語言符號型別
- C語言中的各種修飾符C語言
- C語言中的#和##C語言
- C語言系列(二)有符號數和無符號數詳解C語言符號
- [C]有符號數和無符號數符號
- c語言中的getchar()和EOFC語言
- C語言中 * 和 &的實際理解C語言
- C++中*和&符號C++符號
- C語言之有符號無符號整數取值範圍C語言符號
- C語言-識別符號命名C語言符號
- 程式語言中為什麼使用分號作為語句結束符?
- C語言中,&和&&都是做什麼的?C語言
- c語言中的&的用法C語言
- C語言中“陣列名”和“&陣列名”C語言陣列
- C語言中編譯和連結C語言編譯
- C語言中取地址符&做函式形參?—— 引用的討論C語言函式
- C語言中水平製表符 與退格鍵 的使用方法探索C語言
- C語言中const和#define的區別C語言
- C語言中的getchar和putchar詳解C語言
- C語言中的Const常量和優化C語言優化
- C語言中的置0和置1操作C語言
- C語言中sync()C語言
- C語言中有C語言
- 解析C語言中的sizeofC語言
- C語言中extern的用法C語言
- C語言中&&,||,&,| 的區別C語言
- Go 語言指標符號 *和&Go指標符號
- 【C】 30_C語言中的字串C語言字串
- 1413: C語言合法識別符號C語言符號
- C語言中pi=&j和*pi=j的區別C語言
- C/C++語言巨集定義##連線符和符#的使用C++
- C 語言中的 time 函式函式
- c語言中的關鍵字C語言
- C語言中的檔案流C語言
- C語言中的abort函式C語言函式
- 解析C語言中的sizeof (轉)C語言
- C 語言中的 sscanf 詳解
- static在C語言中的作用C語言