C語言指標 指標和陣列

2021-06-25 23:27:48 字數 1919 閱讀 6363

先看乙個常用的例子:

#include

int main(void)

;int *p = a;

printf("%d ", p[0]);

return 0;

}這段**編譯和執行都沒有任何問題,程式會列印出1這個值,但是為什麼可以這樣用呢?p明明是乙個int型別的指標,這裡怎麼可以使用p[0]這種陣列的操作呢?而且我們使用sizeof去測試a和p得到的乙個是a陣列的大小,乙個是p指標的大小,這兩個型別是不一樣的。其實這個是c語言內部的原因,乙個指標變數在使用類似p這樣的運算的時候,編譯器內部相當於對p做了一次型別提公升,將p其提公升為該型別的陣列,注意這裡僅僅會提公升一次哦!看下面的例子:

#include

int main(void)

;int *p = (int *)a;

printf("%d ", p[0]);

return 0;

}#include

int main(void)

;int *p = (int *)a;

printf("%d ", p[0][0]);

return 0;

}這段**編譯或者執行的時候會出錯嗎?答案是編譯的時候會報錯,因為p是乙個int型別的指標,使用這種運算的時候編譯器會將其提公升一次,僅僅是一次,所以p最多會被提公升到一維陣列的程度,然而這裡的p[0][0]這樣的操作顯然是針對二維陣列的,編譯器不允許這樣的用法。再看下面的例子:

#include

int main(void)

;int (*p)[3] = a;

printf("%d ", p[0][0]);

return 0;

}注意這個例子,編譯和執行都不會出錯,因為p是乙個陣列指標,a直接賦值給p也不會出錯,這裡也說明,陣列在給該型別的指標賦值的時候,編譯器預設最多降一級,也就是說一維陣列給指標直接賦值編譯器允許,二維陣列給該型別的陣列指標賦值編譯器允許,但是跨過兩級就不行了,就像上乙個例子。同時從這裡也可以看出,p[0][0]這樣的操作是允許的,p被提公升為二維陣列,p也是被提公升了一級。這段**會列印出1。再看下面的例子:

#include

int main(void)

;int (*p)[3] = a;

printf("%d ", p[1]-p[0]);

return 0;

}這段**的編譯和執行都沒有出錯,列印的值是多少呢?首先來分析一下這個程式,p[1]中的p表示的是乙個陣列指標,然而使用p這種操作,p會被提公升一級成為乙個二維陣列的形式,那麼p[1]就相當於a[1],p[0]就相當於a[0],那麼a[1]-a[0]的值是多少呢?a[1]是二維陣列a中第二個[3]一維陣列的首位址,而a[0]是a中第乙個[3]一維陣列的首位址,所以兩個首位址之間相差sizeof(int)*3,然而由於這裡是指標(位址)的運算,所以這裡的值應該是(sizeof(int)*3)/sizeof(int),所以最終的輸出結果為3。再看下面的**:

#include

int main(void)

;int (*p)[3] = a;

printf("%d ", *p[0]);

return 0;

}這段**會輸出什麼呢?答案是輸出1。首先需要知道的是運算的優先順序高於*運算子,然後p[0]代表的是a[0]也就是第乙個一維陣列的首位址,然後使用*(位址)這種寫法的時候,取的是這個位址的值,所以也就是a[0][0]的值,因為a[0]=&a[0][0]。再看下面的例子:

#include

int main(void)

;int (*p)[3] = a;

printf("%d ", *(p+1)[0]);

return 0;

}這段**會輸出什麼呢?答案是4。首先p是乙個陣列指標,所以p+1的運算對應過去編譯器理解是指到下乙個一維陣列的首位址,所以p+1實際上的值為p+1*sizeof(int)*3,後面的理解就跟上面的相同了。

C語言指標陣列和陣列指標

初學者總是分不出指標陣列與陣列指標的區別。其實很好理解 指標陣列 首先它是乙個陣列,陣列的元素都是指標,陣列佔多少個位元組由陣列本身決定。它是 儲存指標的陣列 的簡稱。陣列指標 首先它是乙個指標,它指向乙個陣列。在32 位系統下永遠是佔4 個位元組,至於它指向的陣列佔多少位元組,不知道。它是 指向陣...

C語言指標陣列和陣列指標

初學者總是分不出指標陣列與陣列指標的區別。其實很好理解 指標陣列 首先它是乙個陣列,陣列的元素都是指標,陣列佔多少個位元組由陣列本身決定。它是 儲存指標的陣列 的簡稱。陣列指標 首先它是乙個指標,它指向乙個陣列。在32 位系統下永遠是佔4 個位元組,至於它指向的陣列佔多少位元組,不知道。它是 指向陣...

C語言指標陣列和陣列指標

初學者總是分不出指標陣列與陣列指標的區別。其實很好理解 指標陣列 首先它是乙個陣列,陣列的元素都是指標,陣列佔多少個位元組由陣列本身決定。它是 儲存指標的陣列 的簡稱。陣列指標 首先它是乙個指標,它指向乙個陣列。在32 位系統下永遠是佔4 個位元組,至於它指向的陣列佔多少位元組,不知道。它是 指向陣...