陣列 指標雜記

2021-07-05 02:15:34 字數 2382 閱讀 5363

一維陣列

一維陣列例如:int a[5]=;

陣列實際上是一種構造型別,是記憶體的一段連續的儲存區域。

其中int指明了記憶體訪問方式,包括元素的型別,每次跳躍的步長;

其中5指明了構造型別中資料元素的個數,也就是說指明了陣列訪問時候的可偏移的範圍;

其中a有兩重含義:

1).作為陣列名,a表示一種構造資料型別,這也就是為什麼 sizeof(name) == sizeof(type [n])。

2).作為陣列名,訪問成員時它是首元素的位址 name[i] == *(name+i) == i[name]。

其中,表示部分初始化,這樣寫代表把第乙個元素初始化為0,當我們部分初始化時候,沒有被我們初始化的元素自動初始化為0,而不是說我們就把全部的元素初始化為0,若是,也就是第乙個元素10,其他元素自動為0.

對於陣列可做如下理解:

型別:type [n]

定義:type name[n]

大小:sizeof(type [n]) 或 sizeof(name)

但是當我們 做這樣的定義:int *p=name;或者把陣列作為引數傳遞到函式中時,這個時候再求sizeof(p)的大小就僅僅是當前系統下乙個指標型別的大小了(32位系統指標型別大小為4個位元組,64為系統指標型別為8個位元組)。若是在陣列定義的區域內對陣列名求sizeof()的到的就是整個陣列在記憶體中所佔空間大小。

為什麼非要是a[0]開始呢?[ ]可以理解為基址變址運算子,對於a[0]來說,a是基址,0是偏移量,合起來就是變址,a[0]等價於*(a+0),由於a代表首元素的位址,所以只有當a偏移0個單位才可以訪問到首元素,所以必須是a[0]開始。基於以上原理,其實 a[i] 可以寫成 i[a],它依然等價於*(a+i)。

c語言不允許陣列越界,但是自己不做越界檢查,要程式設計師自己做越界檢查,所以要是訪問越界,那結果將是沒有定義的,會造成不可預知的錯誤。

一維陣列名,本質上是乙個一級指標,但是對一維陣列名做 & 運算,得到的是乙個陣列指標,而不是乙個二級指標。

int array[10];

int (*p)[10]=&array;//這是正確的

int **p=&array;//這是錯誤的

可以通過一級指標修改0級指標的內容,可通過n級指標修改n-1級指標的指向,總結起來還是一句話,通過指標可以修改它所指向的內容。

下面是一下大小還有跳躍幅度的大小比較程式:

#include int main(void)

二維陣列

二維陣列本質上也是一維陣列,只是陣列成員由基本資料型別變成了構造資料型別(一維陣列)。

定義形式:type name[m][n];其實等價於type[n] name[m],可以這麼理解。一維陣列的部分初始化和清零依然適用於二維陣列。

訪問概念辨析:

a表示第0行的首位址,a+i表示第i行的首位址。

*(a+i)    等價於a[i]    等價於&a[i][0],表示第i行第0個元素的位址;

*(a+i)+j    等價於a[i]+j    等價於&a[i][j],表示第i行的第j個元素的位址;

*(*(a+i)+j)    等價於*(a[i]+j)    等價於a[i][j],表示第i行的第j個元素;

二維陣列在記憶體中開始連續的一維空間,所以依舊可以把二維陣列當成一維陣列來訪問,但是需要強制轉化:

#include int main()

; int i,j;

for(i=0;i<2; i++)

putchar(10);

}int *p = (int *)array;

for(i=0; i<6;i++)

return 0;

}

相應的也可以把一維陣列當二維陣列來使用,但是這個也需要強制轉換,如:int (*p)[2]=(int (*) [2])array;其中array是一維陣列名。

如何傳遞乙個二維陣列到函式中,例如有二維陣列:int a[3][4];則接收它的函式引數是 function(int (*p)[4], n);

二維陣列中一些位址間的差異辨析:

int main(void)

; int *p=(int *)a;

printf("%d\t,%d\n",sizeof(a),sizeof(p));//60 8

printf("&a[0]=%p,&a[0]+1=%p\n",&a[0],&a[0]+1);//相差20=5*4

printf("a=%p\t,a+1=%p\n",a,a+1);//相差20=5*4

printf("&a=%p\t,&a+1=%p\n",&a,&a+1);//相差60=5*4*3

return 0;

}

二級指標比較典型的是用二級指標管理二維空間

陣列與指標雜記

expert c programming 中花了兩篇寫了陣列與指標,這裡將其中的乙個圖記錄一下,也算是平時程式設計稍不注意就會產生bug的地方。不同點 1.宣告的時候,如extern char a,不能改寫成指標的形式 2.定義的時候,如char a 10 不能改寫成指標的形式 相同點 1.函式的引...

C 指標 陣列 字串結論雜記

1.在陣列做函式形參時,a 3 表示乙個第二維的角標個數是3的乙個陣列,傳入實參b i j 時,j 3,而i能滿足函式體裡的語句的需要即可。2.a i j 做函式形參時,實參b m n 的要求是n j且m i。3.作業系統不檢查陣列第一維的邊界,但檢查 二維及二維以上的邊界,或大或小均不行。針對陣列...

C語言指標雜記

1.指標就是位址,位址就是指標 2.指標變數 定義某個變數,這個變數中存的是位址 指標 的值 3.void型別的指標在傳參過程中可以接受任何型別指標的值,也可以把自己的值傳給任何型別的指標 4.int p 3 指標p指向int型別的資料,該資料有3個int型別那麼大 5.int arr 2 3 6....