C語言數組

數組

由N個相同元素組成的一片連續的內存空間,通過下標運算符[n] 的方式去訪問(0 <= n < N-1)。如果n >= N那麼就會有可能出現越界的問題導致程序報錯退出,如果你剛好越界的地址沒有被其他程序使用,那就不會出錯,但一旦是被使用的,那就會出錯了,所以爲了避免出錯就不要越界。用指針的說法就是指針操作非法內存。

一維數組

一維數組即是隻有一個[]組成的數組。

定義方式:類型 變量名[常量表達式];如int a[10]; int b[4+6];
定義時初始化:數組 = {}; 如int a[10] = {0,1,2,3};初始化個數不足長度的時候,後面的元素編譯器會自動填0,所以等同於int a[10] = {0,1,2,3,0,0,0,0,0,0};
訪問方式:下標訪問。如int a[10] = {0,1,2,3};  int b = a[2];
賦值方式:下標訪問賦值。如int a[10]; a[0] = 0; a[2] = 2;

二維數組

二維數組即是由兩個[]組成的數組。可以理解成由N個一維數組組成。

定義方式:類型 變量名[常量表達式];如int a[2][10]; int b[2][4+6];
定義時初始化:數組 = {{},...}; 如int a[2][10] ={{0,1,2,3} ,{4,5,6}};初始化個數不足長度的時候,後面的元素編譯器會自動填0
訪問方式:下標訪問。如int a[2][10] = {{0,1,2,3} ,{4,5,6}};  int b = a[1][2];
賦值方式:下標訪問賦值。如int a[10]; a[0] = 0; a[2] = 2;

n維數組

不管是幾維數組,都是由N個相同元素組成的一片連續的內存空間,定義成多維數組只是爲了方便操作(不用自己算間距)和理解,最主要是方便理解。主要用一維、二維、三維數組,維數再大就難以理解了,因爲我們大部分人都知道點(普通變量)、線(一維數組,X座標軸)、面(二維數組,XY座標軸)、立體(三維數組,XYZ座標軸)。
如下例子:

#include <stdio.h>
int main(void)
{
	int linearArray[12] = { 0,1,2,3,4,5,6,7,8,9,10,11 };//一維數組,12個元素
	int _2DArray[3][4] = { {0,1,2,3} ,{4,5,6,7} ,{8,9,10,11}};//二維數組,3*4個元素
	int _3DArray[3][2][2] = {{{0,1},{2,3}} ,{{4,5},{6,7}} ,{{8,9},{10,11}}};//三維數組,3*2*2個元素

	printf("%p, %p, %p", linearArray, _2DArray, _3DArray);
	printf("\n%d, %d, %d", linearArray[6], _2DArray[1][2], _3DArray[1][1][0]);//下標:1x4+2 = 6。 1x4+1x2+0 = 6
	return 0;
}

在這裏插入圖片描述

其他用法

  1. 定義時靠近變量名的[]裏面可以不寫長度,但要初始化。
int a[] = {0,1,2,3},//a爲一維數組,長度就爲4。
//int c[];//這寫法是錯誤。編譯器會報錯
int b[][5] = {{0} ,{1}};//b爲二維數組,長度爲10(2x5),等同於int b[2][5] = {{0,0,0,0,0} ,{1,0,0,0,0}};
//從上可以看出,[]不填長度,定義時就必須要把你要的長度的個數給初始化了
  1. 字符串,實際就是char數組。這篇文章有講關於字符串的知識
void main()
{
	/**********************************************
	* 這是字符串的定義初始化方式。如果你要字符串長度就是初始化的長度,那可以不填,如果要自定義就填。
	* 但字符串長度不等同於數組長度。而且數組長度必須要>=字符串長度+1
	********************************************* /
	char str[10] = "cjz";//特殊的初始化方式,只有char數組支持這樣的初始化方式。等同於char str[10] = {'c', 'j', 'z'};
	char s[] = "hello";//數組長度6,字符串長度5
	system("pause");
}
  1. 數組首地址。指針知識跳轉
void main()
{
	int a[10] = { 0,1,2,3,4,5,6,7,8,9 };//a代表的是數組的首地址(首元素的地址),其類型是int *。
	//a的值等同於&a,等於&a[0],都是首地址,但其對應的類型不同,a和&a[0]都是int *,&a是int (*)[10]。如果只需要首地址,這三種方式都可以。
	//&a = 0; //&a其實是一個地址,類型是int (*)[10] , 地址是常量,常量是不能做左值的。比如數組a[10]的首地址是0x1234,那麼&a就是代表0x1234,所以0x1234=0是不對的。
	//正確操作應該如下
	a[0] = 0

	int b[2][2] = {{0}};
	//b的值等同於&b,等於&b[0],等於&b[0][0],都是首地址,但其對應的類型不同,b和&b[0]是int (*)[2],&b是int (*)[2][2],&b[0][0]是int *。
	system("pause");
}
  1. 變長數組,並不是所有IDE(如VS並不支持)都支持這樣的寫法。不推薦這樣使用,建議使用動態內存分配。
int n = 10;
int a[n];
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章