一維陣列
一維陣列例如: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....