C語言數組
一、數組的概念
用來存儲一組數據的構造數據類型
特點:只能存放一種類型的數據,如全部是int型或者全部是char型,數組里的數據成為元素。
二、數組的定義
格式: 類型 數組名[元素個數];
舉例:存儲5個人的年齡
Int agrs[5]; //在內存中開辟4x5=20個字節的存儲空間
可以在定義數組的同時對數組進行初始化:
Int ages[5]={17,18,19,20,21};
遍歷數組:
For(int i=0;i<5;i++)
{
PRintf(“ages[%d]=%d/n”,i,ages[i]);
}
注意:
(1)數組的初始化
①. Int ages[5]={17,18,19,20,21};//一般寫法
②. Int ages[5]={17,18};//只對前兩個元素賦值
③. Int ages[5]={[3]=10,[4]=11};//對指定的元素賦值,這里為第三個和第四個
④. Int ages[]={11,12,13}.//正確,右邊的元素確定,則個數可以省略這里為3個。
⑤. Int ages[];//錯誤,編譯器無法知道應該分配多少的存儲空間
⑥. Int ages[5];ages={17,18,19,20,21};//錯誤,只能在定義數組時這樣進行初始化
⑦. Int ages[‘A’]={1,2,3};//正確,相當于是ages[65]
⑧. Int count=5;int ages[count];//如果不進行初始化,則這種寫法正確,編譯器不會報錯為其分配20個字節的存儲空間,ages[0]=1;ages[1]=2;可以像這樣對數組的元素進行賦值,但是2,3,4等元素的值時不確定的。
⑨. 而int count=5;int ages[count]={1,2,3,4,5};//這種寫法是錯誤的,在定義數組時對數組進行初始化,元素的個數必須為常量或者不寫,不能是一個變量
(2)計算數組元素
當沒有表明數組元素個數時,如何對其進行遍歷(要求使用數組元素個數)?
可以使用sizeof運算符來計算數組元素的個數
Int count=sizeof(ages)/sizeof(int); //數組的總長度除以單個的長度等于元素個數
三、數組內存存儲細節
假設有數組如下:
Int x[]={1,2};
Char ca[5]={‘a’,‘A’,‘B’,‘C’,‘D’};
數組名即代表數組的地址,數組的地址==數組名(ca)==數組的首元素的地址&ca[0]
在內存中,內存從大到小進行尋址,為數組分配了存儲空間后,數組的元素自然的從上往下排列存儲,整個數組的地址為首元素的地址。
模擬該數組的內存存儲細節如下:
注意:字符在內存中是以對應ASCII值的二進制形式存儲的,而非上表的形式。
在這個例子中,數組x的地址為它的首元素的地址0x08,數組ca的地址為0x03。
四、數組-傳址調用
Void change(int array[]) //數組可以作為函數的形參,可以省略數組元素的個數
{
Array[0]=100;
}
Void change2(int a) //基本類型作為函數的形參
{
a=200;
}
Int main()
{
Int ages[5]={1,2,3,4,5};
Change2(ages[0]);
Change(ages);
Return 0;
}
Array數組與ages數組的地址一致,若以數組作為函數的參數,這種傳遞方式是傳址調用,傳遞的是整個數組的地址,修改形參數組元素的值,就是修改實參的值。
當你把一個數組當做參數來傳遞時,它會看做是一個指針,在該函數體內使用sizeof運算符來計算數組的長度,得出的數值永遠為8,而非數組的實際長度,因為任何類型的指針都占8個字節的存儲空間。
提示:數組作為一個函數的參數時,如果函數體涉及到數組遍歷等操作,通常把數組的實際元素個數也作為參數傳遞給函數。
如 void maxofarray(int array[],sizeof(ages)/sizeof(int)){....}
五、二維數組
Int ages[50];//數組能夠存放50個int類型的數據
Int ages1[3][10];//數組能夠存放3個數組,每個數組存放10個數值,共3x10=30個述職數值。
一個二維數組a,a包括兩個一維數組a[0]和a[1],每個一維數組都包括三個元素。
使用場合:五子棋,俄羅斯方塊等,
假設:
char Y[3][2]={
{‘A’,‘B’},
{‘C,‘D’},
{‘E,‘F’}
};
內存情況:
新聞熱點
疑難解答