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},
};
千里之行,始於足下。不積跬步,無以至千里