1. 程式人生 > 其它 >C語言陣列

C語言陣列

1、簡單概述

陣列是同種資料型別組成的集合,也可以說是同種資料型別變數的集合。陣列是集合的一種,我們獲取得到集合,就可以來操作集合中的變數。

陣列的記憶體空間地址是連續的,資料型別必須都相同,如果不相同就不符合定義。

2、操作

首先先定義一個數組。陣列的初始化分為完全初始化和部分初始化以及不初始化

// 完全初始化
int a[5] = {1,2,3,4,5};
// 部分初始化
int b[5]= {1,2};
// 不初始化,不進行初始化,裡面全部都是垃圾值。
int c[5];

就拿最後一個不初始化來舉例子:

# include <stdio.h>
int main(void){
	
	int a[4];
	for(int i = 0;i<4;i++){
		printf("對應的值是:%d\n",a[i]);
	}
	return 0;
}

下面進行正常的測試:

# include <stdio.h>
int main(void){
	
	int a[4] = {1,2,3};
	// int[3] b = {3,4,5};
	printf("a對應的值是:%d\n",a);
	printf("a[0]對應的值是:%d\n",a[0]);
	printf("a[1]對應的值是:%d\n",a[1]);
	printf("a[2]對應的值是:%d\n",a[2]);
	printf("a[3]對應的值是:%d\n",a[3]);
	printf("a[4]對應的值是:%d\n",a[4]);
	return 0;
}

直接看控制檯輸出:

a對應的值是:6487568
a[0]對應的值是:1
a[1]對應的值是:2
a[2]對應的值是:3
a[3]對應的值是:0
a[4]對應的值是:10687360

--------------------------------
Process exited after 0.1377 seconds with return value 0
請按任意鍵繼續. . .

問題1:a是什麼?

這裡有一個很詭異的現象,a輸出的整型值是6487568,那麼這個a是什麼?

問題2:定義一個數組,長度是4,裡面有4個元素,從下表0開始,a[0]、a[1]、a[2]、a[3]這四個元素,但是a[4]又是什麼?

解決第一個問題:

a代表的是指向這個陣列中第一個元素的地址,而不是這個地址裡面儲存的值。這個可以驗證:

# include <stdio.h>
int main(void){
    // 我這裡只是給陣列中的三個元素進行了賦值,而沒有對後面的元素進行賦值,那麼預設初始化就是0
	int a[4] = {1,2,3};
	// int[3] b = {3,4,5};
	printf("a對應的值是:%d\n",a);
	printf("a[0]對應的值是:%d\n",&a[0]);
	return 0;
}

控制檯輸出:

a對應的值是:6487568
a[0]對應的值是:6487568

--------------------------------
Process exited after 0.1527 seconds with return value 0
請按任意鍵繼續. . .

對a[0]取地址,可以看到a[0]當前所處的記憶體空間的地址值和a是一樣的,那麼就是說a和a[0]的地址是同一塊空間。

解決第二個問題:

a[4]是什麼?首先在分配記憶體的時候,OS只分配了一個數據,長度是4,元素只有:a[0]、a[1]、a[3]、a[3]這四個元素,對於a[4]來說,看看下面的實驗:

# include <stdio.h>
int main(void){
	
	int a[4] = {1,2,3};
	// int[3] b = {3,4,5};
	printf("a對應的值是:%d\n",a);
	printf("a[0]對應的值是:%d\n",&a[0]);
	printf("a[1]對應的值是:%d\n",&a[1]);
	printf("a[2]對應的值是:%d\n",&a[2]);
	printf("a[3]對應的值是:%d\n",&a[3]);
	printf("a[4]對應的值是:%d\n",&a[4]);
    printf("a[4]對應的值是:%d\n",a[4]);
	return 0;
}

控制檯輸出:

a對應的值是:6487568
a[0]對應的值是:6487568
a[1]對應的值是:6487572
a[2]對應的值是:6487576
a[3]對應的值是:6487580
a[4]對應的值是:6487584
a[4]對應的值是:1774464

--------------------------------
Process exited after 0.1567 seconds with return value 0
請按任意鍵繼續. . .

可以驚奇的發現,原來地址也是對應的+資料型別所佔用的位元組數。但是a[4]這塊記憶體空間儘管存在,但是對應的是垃圾值,而不是預設值。

因為這塊空間不屬於陣列的,所以這裡沒有進行初始化。

3、錯誤示例

錯誤示例一

# include <stdio.h>
int main(void){
	
	int a[4];
	a[4]= {1,2,3};
	return 0;
}

編譯都不會通過,因為首先進行了陣列的宣告定義,然後再進行賦值的時候,發現沒有a[4],也可以說a[4]對應的記憶體空間裡存放的是垃圾值。

陣列中根本就不存在著a[4],更何況是賦值:

# include <stdio.h>
int main(void){
	
	int a[4];
	a[4]= 2;
	printf("a[4]對應的值是:%d\n",a[4]);
	return 0;
}

控制檯直接輸出錯誤,這裡和上面對比,可以發現,如果在宣告的時候進行了初始化,輸出a[4]不會出現問題,但是先聲明後賦值,就出現了問題。

所以從這裡可以看出來,陣列在C語言中就已經知道了陣列的長度,因為在定義的時候就已經指明瞭。

錯誤示例二

最經典的一種方式就是陣列進行賦值,如:將陣列a賦值給陣列b,也就是說將a陣列中的值都賦值給b陣列中的元素;

# include <stdio.h>
int main(void){
	
	int a[4] ={1,2};
	int b[] = {};
	b = a;
	for(int i = 0; i<4;i++){
		printf("b中元素的值是:%d\n",b[i]);
	}
	return 0;
}

編譯不會通過,那麼使用下一個方式:

# include <stdio.h>
int main(void){
	
	int a[4] ={1,2};
	int b[] = {};
	// b = a;
	for(int i = 0; i<4;i++){
		b[i] = a[i];
		printf("b中元素的值是:%d\n",b[i]);
	}
	return 0;
}

檢視控制檯輸出

b中元素的值是:1
b中元素的值是:2
b中元素的值是:0
b中元素的值是:0

--------------------------------
Process exited after 0.4152 seconds with return value 0
請按任意鍵繼續. . .

賦值成功。

4、陣列操作

陣列中的操作:新增、刪除、移動、遍歷、最值問題,但是其他語言實現的時候,都會有對應的工具包來進行操作這些陣列。我們只需要來操作這些工具類即可來進行運算元組了。

5、二維陣列

先甩出來一個二維陣列:int a【3】【4】,那麼對應的資料就有3*4=12個,有十二個資料

a[0][0] a[0][1] a[0][2] a[][3]
a[1][0] a[1][1] a[1][2] a[1][3] 
a[2][0] a[2][1] a[2][2] a[2][3] 
a[3][0] a[3][1] a[3][2] a[3][3]     

所以從上面觀察可以看出來,a【m】【n】代表的是第(m+1)行第(n+1)列的值;

那麼int a【m】【n】這個定義說明了,二維陣列的最後一個值是a【m-1】【n-1】

二維陣列的空間結構:

我覺得就是一個一維陣列中嵌套了一個一維陣列,行或者是列中儲存的是一個數組的首地址的值。

二維陣列的初始化:

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

int b[2][3]={
    	{1,2,3},
        {4,5,6},
        {7,8,9},
};
千里之行,始於足下。不積跬步,無以至千里