在這裡隨便定義乙個陣列
int arr[5];
arr現在就是陣列名, arr 代表的是該陣列整塊記憶體,即sizeof(arr) == 20 (假設sizeof(int) == 4), arr 裡的內容是該塊記憶體的首位址,即 arr == &arr[0] 。 arr可以看做是乙個常量,也就不可以使用 arr++ 之類的運算。
int *p;
p = arr;
p是乙個指向int型別的指標,p = arr,就是把陣列的首位址(arr的內容就是陣列的首位址,這個前面有分析)賦給p,即 p 現在就是指向陣列的首位址,通過 p 就可以訪問整個陣列,但是 p 這裡只是是個指標變數,也就是 p 的本質沒有改變,p 不能和 arr 一樣代表整個陣列的記憶體, 所以 sizeof(p) == sizeof(int*) != sizeof(arr)。
把陣列的首位址賦給 p,但 p 的本質乙個int型別的指標變數,所以也就可以對 p 進行 ++ 之類的運算。
我們可以通過對 p ,arr 的偏移(int型別的指標 +1 或 -1, 是向上或向下偏移 sizeof(int) 個byte)來訪問陣列裡的元素, *( p + i ) ,*(arr + i),也可以通過傳統的 arr[i] 訪問陣列。
舉個例子(例子**於老師上課時講解的):
int a[5] = ;
int *ptr = (int*)(&a + 1);
printf("%d, %d", *(a + 1), *(ptr - 1));
這裡的輸出的值應該是?
a 是
代表(不是指向)的是整個陣列記憶體,a 的值是該陣列記憶體的首位址
, 對 a 取位址(&a),即......,所以這裡的
&a 是指向整個陣列的記憶體塊,
所以 a 的值與 &a 的值是一樣的,都是該陣列的首位址,但他們的含義是不一樣的。
這裡 &a 的每次偏移是移動整個記憶體塊的大小,這裡就是移動 sizeof(a),即40 byte,所以這裡的 &a + 1, 是指標向下移動個40byte(陣列記憶體塊的大小),&a+1的指向 是下個 sizeof(a)大小的記憶體塊。
下面是記憶體分配圖:
&a ---> ********** 假設這裡的位址值是 0x11111111 &a 和 a 的值都是 0x11111111
|| 1 ||
**********
|| 2 ||
**********
|| 3 ||
**********
|| 4 ||
********** <-----ptr-1 int型別的指標每偏移是 sizeof(int) 個 位元組
|| 5 ||
&a +1 ---> ********** <-----ptr 上面的題目中 讓 int 型別的指標 ptr 也指向了這裡
|| ? ||
**********
|| ? ||
**********
|| ? ||
**********
|| ? ||
**********
|| ? ||
&a+2 ---->**********
|| ? ||
**********
""""""
""""""
""""""
所以上面題目的輸出結果 是 :
2,5以上都是我個人對於c中指標與陣列的理解,若有什麼不對的地方,歡迎指出!
**:
C 中的陣列和指標
1 include 2 include 34 using namespace std 56 intmain 7 9int p 2 10 p k 11 cout 0 0 p 0 1 p 2 1213 return0 14 輸出 10,20,50 c語言英語的表達 中文的表現 int hoge hoge...
C 中陣列的下標和指標
我們知道,當我們在表示式中使用陣列名時,實際上使用的是指向陣列首元素的指標,實際上使用陣列名參加下標運算時,本質上參加運算的仍然是指向陣列首元素的指標 int ia int i ia 2 ia 2 的運算過程實際是這樣的 ia 2 實際上只要指標指向陣列元素,我們就可以對它進行下標操作 int p ...
c 陣列指標和指標陣列
先記住 指標陣列 本質是陣列,資料可以用來存放int float等物件,當然也可以存放指標。例子 陣列指標,用樓上的話就是指向陣列的指標,操作指標就可以運算元組如下 int a 3 int p a printf 陣列指標 d n p 1 列印的結果為2,原因是p初始化指向了陣列a的首位址,即a 0 ...