陣列與指標

2021-09-20 10:28:47 字數 2639 閱讀 9828

1、乙個一維int陣列的陣列名實際上是乙個int* const p型別,p指向第乙個元素; 

2、乙個二維int陣列的陣列名實際上是乙個int (*const p)[n],p指向第一行;

3、陣列名做引數會退化為指標,除了sizeof,也就是說sizeof(a),返回的是陣列大小不是指標大小。

int num =0 ;                       //在32機器中告訴c編譯器分配4個位元組的記憶體 

int a = ; //告訴c編譯器分配32個位元組的記憶體

printf("a:%d ,a+1:%d,&a:%d,&a+1:%d\n",a,a+1,&a,&a+1) ;

//a+1 和 &a+1 結果不一樣

//雖然輸出結果上面,a和&a一樣,但是a和&a所代表的資料型別不一樣

/*重要*/

//a代表的資料首元素的位址(首元素),同時與整個陣列位址重合,但其不能代表整個陣列,只能代表起始個體的位址

//&a代表的是整個陣列的位址(特別特別的注意),它的+1是以整塊陣列所佔位元組數總數為單位+1

輸出結果:a:1638176 ,    a+1:1638180,    &a:1638176,    &a+1:1638208假設有一維陣列:

char a[3]
該陣列一共有3個元素,元素的型別為char,如果想定義乙個指標指向該陣列,也就是如果想把陣列名a賦值給乙個指標變數,那麼該指標變數的型別應該是什麼呢?前文說過,乙個陣列的陣列名代表其首元素的首位址,也就是相當於&a[0],而a[0]的型別為char,因此&a[0]型別為char *,因此,可以定義如下的指標變數:

char* p = a;    //相當於char* p = &a[0]

大家都應該知道,a和&a[0]代表的都是陣列首元素的首位址,而如果你將&a的值列印出來,會發現該值也等於陣列首元素的首位址。請注意這裡的措辭,也就是說,&a雖然在數值上也等於陣列首元素首位址的值,但是其型別並不是陣列首元素首位址型別,也就是char *p = &a是錯誤的。

char (*p)[3] = &a;
但為什麼不能用 char** p=&a 來初始化呢,a[0]的型別是char,&a[0]的型別就是char*。a雖然代表首元素的首位址,但a只是值等於&a[0],a的型別其實是char [3],所以&a的型別就是char (*)[3]!很多人對類似於a+1、&a+1、&a[0]+1、sizeof(a)、sizeof(&a)等感到迷惑,其實只要搞清楚指標的型別就可以迎刃而解。比如在面對a+1和&a+1的區別時,由於a表示陣列首元素首位址,其型別為char *,因此a+1相當於陣列首位址值+sizeof(char)即第二個元素的位址(相當於位址+位址裡放的東西的sizeof*個數);而&a的型別為char (*)[3],代表整個陣列,因此&a+1相當於陣列首位址值+sizeof(a)(這裡的a就不是位址了,而是代表陣列這個東西),也可以理解成位址+sizeof(型別去掉*)*個數

sizeof(a)代表整個陣列大小,但無論陣列大小如何,sizeof(&a)永遠等於乙個指標變數占用空間的大小,具體與系統平台有關。

假如有如下二維陣列:

char a[3][2];
由於實際上並不存在多維陣列,因此,可以將a[3][2]看成是乙個具有3個元素的一維陣列,只是這三個元素分別又是乙個一維陣列。實際上,在記憶體中,該陣列的確是按照一維陣列的形式儲存的,儲存順序為(低位址在前):a[0][0]、a[0][1]、a[1][0]、a[1][1]、a[2][0]、a[2][1]。(此種方式也不是絕對,也有按列優先儲存的模式)

為了方便理解,此處畫了一張邏輯上的記憶體圖,之所以說是邏輯上的,是因為該圖只是便於理解,並不是陣列在記憶體中實際的儲存模型(實際模型為前文所述)。

a是第一維陣列的陣列名,代表首元素首位址,而首元素是乙個具有兩個char型別元素的一維陣列,因此a就是乙個指向 具有兩個char型別元素陣列的陣列 的指標,而首元素的型別為char [2],所以a的型別就是char(*)[2]。同理a[0]其實乙個一維陣列,其第乙個元素為a[0][0],型別為char,所以a[0]相當於其第乙個元素的位址也就是&a[0][0],其型別為char*,所以可以如下賦值:

char (*p)[2]  = a;    //a為第一維陣列的陣列名,型別為char (*)[2]

char* p = a[0]; //a[0]為第二維陣列的陣列名,型別為char *

char (*p)[3][2] = &a;

指標與陣列,指標陣列 陣列指標

int a 10 print n a p,a p a,a print n a 1 p,a 1 p a 1,a 1 a做乙個指標,步長為4,指向乙個元素,a做乙個指標,步長為40,指向乙個維陣列 int b 3 4 print n b p,b p,b p b,b,b print n b 1 p,b 1...

指標陣列與陣列指標

1.指標陣列 指標陣列中每乙個元素都是乙個指標,也既是存放字串的首位址。所以指標陣列適合處理若干個長度不等的字串。定義的一般形式為 型別說明符 指標陣列名 陣列長度 例如 int p 3 宣告乙個陣列,指標陣列p,由3個int型別指標變數元素組成 從運算子的優先順序分析,由於 的優先順序大於 所以p...

指標陣列與陣列指標

呵呵,實在是厭倦了繞口的解釋。指標陣列,故名思義,就是指標的陣列,陣列的元素是指標 陣列指標,同樣,就是直想陣列的指標。簡單舉例說明 int p 2 首先宣告了乙個陣列,陣列的元素是int型的指標。int p 2 宣告了乙個指標,指向了乙個有兩個int元素的陣列。其實這兩種寫法主要是因為運算子的優先...