C中的陣列和指標

2021-06-27 19:25:07 字數 1891 閱讀 3933

在這裡隨便定義乙個陣列

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 ...