之前對*和&符號一直理解的比較淺顯。只知道:
*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 指標取址符號
取址符號 讀音 and 單個常量取址時,必須要加取址符號 陣列取址時,不需要加 符號,預設取陣列第乙個元素位址 include include using namespace std intmain int ptr num 單個常量取址時,必須要加取址符號 int ptr nums nums 陣列取...
引用 取址 指標
include using namespace std 值一樣,但是含義不一樣,做運算過後結果自然不一樣。int main int ptr int a 1 printf d n d n a 1 ptr 1 printf x n a printf x n a 1 陣列首元素的首位址,在此基礎上加1該陣...
向上取整 和向下取整 符號
向下取整的運算稱為floor,用數學符號 表示 向上取整的運算稱為ceiling,用數學符號 表示。例如 59 60 0 59 60 1 59 60 1 59 60 0 向上向下 取整函式數隻會對小數點後面的 數字不為零 的數進行操作,要是給它乙個整數 它就返回整數本身 對小數不為零的數操作 給定 ...