1. 程式人生 > >陣列---學習總結

陣列---學習總結

陣列:

概念: 同一型別的元素的集合體。

注: 這裡的型別不僅僅指C語言中的基本型別如int flaoat char 之類的,還包括很多構造型別,如指標,結構體,陣列等。
對陣列的基本使用 : 陣列只能在定義時對其整體進行初始化,不能在其它地方整體進行賦值。C語言規定陣列的下標預設從0開始。定義陣列時陣列中括號裡面的值只能是常量或常量表達式!

int arr[10]={1,2,3,4,5,}//正確
arr[10]={1,2,3,4,5}//錯誤

陣列的初始化需要注意以下幾點: 陣列 可以只給部分元素賦值。當[ }中值的個數少於元素個數時,只給前面部分元素賦值,後面的元素整型預設為0,字元預設為‘0’,指標預設為NULL…例如:

int a[10]={1, 2, 3 , 4, 5};

表示只給 a[0]~a[4] 5個元素賦值,而後面 5 個元素自動初始化為 0。

當賦值的元素少於陣列總體元素的時候,剩餘的元素自動初始化為 0:
對於short、int、long,就是整數 0;
對於char,就是字元 ‘\0’;
對於float、double,就是小數 0.0。
如果給陣列的全部元素賦值可以省略陣列的大小,陣列預設的大小為陣列元素的個數的大小。

int arr[]={1,2,3,4,5};
int arr[5]={1,2,3,4,5};
//兩者是等價的

利用for迴圈對陣列進行賦值,及對陣列進行遍歷:

   for (i = 0; i < 10; i++)
	{
		scanf("%d", &arr[i]);
	}
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");

多維陣列

如果某個陣列的維數不止一個,它就被稱為多維陣列,其中一維的維數可以省略不寫,原因後面介紹

因為記憶體是線性結構,因此不論是一維陣列還是多維陣列,都可以將它們看做一維陣列來對待。
如:

  int arr[3][4]={0};

這是建立了一個包含12個整型元素的二維陣列,它雖然看著好像 三行四列。但其實它在記憶體中的儲存形式其實是這樣的:
在這裡插入圖片描述
因為所有的陣列都是一維陣列,只是這個數組裡面的元素依然是一個數組而已,這個陣列包含四個整型元素。你可以像操作一維陣列那樣操作它,只是它有12個元素。

陣列名

幾乎每個書上都會寫陣列名是陣列首元素的地址,大多數情況下也確實如此,C語言中只有兩種情況下陣列名代表整個陣列:

int arr[10]={0};
&arr代表整個陣列的地址,這是個陣列指標。賦給整型指標就會有警告,而且它每次加1或者減1,跳過整個陣列大小的長度。
sizeof(arr),sizeof是C語言中的關鍵字,不是一個函式,它的作用是求一個變數或型別所佔空間的大小,以位元組為單位這個表示式的意義是陣列總的位元組數,因此我們可以這樣求一個數組的元素的個數
int sz=sizeof(arr)/sizeof(arr[0]);

陣列名作為函式引數

當陣列進行傳參時,會發生降級問題,降為指標,什麼指標呢?指向其元素型別的指標!因此整型一維陣列降為整型指標,整型二維陣列降為整型一維陣列指標,字串陣列降為二級字元指標…
如何證明它會發生降級問題呢?

void fun(char arr[10])
{
     printf("%d\n",sizeof(arr));
}

這個值得結果在32位平臺下將是4,因為在32位機器上任何指標的大小都是四個位元組。

void fun(char arr[10])
{
     printf("%d\n",sizeof(arr));
}
void fun(char *arr])
{
     printf("%d\n",sizeof(arr));
}

這兩中寫法是一模一樣的,而且在第一種寫法中方括號中的10可以省略不寫。因為此處它是一個指標,並不是一個數組。
為什麼要發生降級呢?
傳參的過程其實是拷貝的過程,函式裡面的變數在函式呼叫時會被分配空間,因此如果不發生降級問題的話,就得分配整個陣列大小的空間,這必然造成很大的資源浪費,因為只要我們傳參的時候再把陣列元素的個數傳進去就可以完成對陣列的所有操作!而且像結構體也最好傳一個結構體指標!