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語言中const修飾符C語言
- C語言中的#和##C語言
- c語言中的getchar()和EOFC語言
- [C]有符號數和無符號數符號
- C語言-識別符號命名C語言符號
- 程式語言中為什麼使用分號作為語句結束符?
- C語言中水平製表符 與退格鍵 的使用方法探索C語言
- C語言中“陣列名”和“&陣列名”C語言陣列
- C語言中編譯和連結C語言編譯
- 1413: C語言合法識別符號C語言符號
- C語言中的置0和置1操作C語言
- 解析C語言中的sizeofC語言
- C語言中extern的用法C語言
- c語言中的作用域C語言
- 【C】 30_C語言中的字串C語言字串
- Go 語言指標符號 *和&Go指標符號
- C語言中pi=&j和*pi=j的區別C語言
- c語言中作用域和儲存期的區別C語言
- C語言合法識別符號 hd 2024C語言符號
- C 語言中的 sscanf 詳解
- C 語言中的 time 函式函式
- static在C語言中的作用C語言
- dart系列之:dart語言中的特殊操作符Dart
- C語言中識別符號的作用域、名稱空間、連結屬性、生命週期、儲存型別C語言符號型別
- Markdown 常用數學符號和語法符號
- 在C語言中,匹配字元一定要用單引號!!!C語言字元
- C語言中函式printf()和函式scanf()的用法C語言函式
- c語言中文和ascii碼字元分離C語言ASCII字元
- C語言中qsort函式的用法C語言函式
- C 語言中 static 的作用介紹
- C語言中的資料型別C語言資料型別
- c語言中sizeof詳解C語言
- 詳解 Go 語言中 20 個佔位符!Go
- markdown特殊符號語法符號
- C語言中continue的理解(fishing_1)C語言
- C語言中volatile關鍵字的作用C語言
- C語言中函式的返回值C語言函式
- 淺談C語言中函式的使用C語言函式