《C语言》总结3--数组

一、一维数组

1.1数组的创建

type_t arr_name [const_n]
//taype_t为数组类型
//arr_name为数组名字
//const_n为常量大小。在C99标准之前,要为一个常量才可以
//例如:
int a=10;
int arr[a]={0};
//这个在C99标准之前就是不合法的数组创建

1.2数组的初始化(数组越界知识点)

我们称创建数组时给数组的内容赋值,称之为初始化

int arr1[10]={1,2,3};
//这里初始化仅初始化了三个值,即1 2 3,而后面的7个数组元素
//将会初始化为数字0

int arr2[] = {1,2,3,4};
//这里const_n留空,而系统会根据初始化内容自动补充数值,即4

注意:

*int  float  double等类型的数组默认初始化的“0”是数字0

*char类型的数组默认初始化的“0”是ASCII码值为0的字符,即为'0'

char arr1[] = {'a','b','c'};
char arr2[] = "abc";

//这里arr1的const_n的数值为3,而arr2的const_n的
//数值为4
//因为如果你是像arr2这样初始化数组的话,这里的\0是
//看不见的,但实际上是{'a','b','c','\0'}

注意:

诸如上图代码的arr2,如果初始化是这样的:

char arr2[3]="abc";

这会导致字符串"abc"的末尾结束标志“\0”无法存储,会造成以下问题:

①数组越界

数组越界:由于一个数组的内存空间是提前划定的,由于系统找不到结束的标志,就会访问arr2数组之后的内存空间,从而导致数组越界。

②字符串操作异常

比如你strlen函数时计算长度的时候就会生成一个随机值。

1.3一维数组的使用

①数组的下标:

数组的下标是从0开始计数的。例如:

int arr[5] = {1,2,3,4,5}
//这里1对应的数组下标时0,2对应的数组下标是1...
//5对应的数组下标是4

②如何求出数组的大小

int arr[5];

int sz = sizeof(arr)/sizeof(arr[0]);

//这里的arr是你所求大小数组的名字
//arr[0]是单个数组元素的大小

1.4一维数组在内存中的储存

数组的元素地址会随着下标的增长而递增。数组在内存中是连续存放的。

譬如:

int arr[5] = {0};

//它们的地址如下
//&arr[0] = 012FFE9C
//&arr[1] = 012FFEA0
//&arr[2] = 012FFEA4
//&arr[3] = 012FFEA8
//&arr[4] = 012FFEAC

//这里地址是以16进制所呈现

 

二、二维数组

2.1二维数组的创建

类比一维数组,二维数组的创建方式如下:

int arr[3][4];
char arr[3][4]

//均为三行四列的数组

2.2二维数组的初始化

方式①:

int arr[3][4] = {1,2,3,4}

//未完全初始化,由于是int类型,所以剩下的自动初始化
//为数字0
//其它类型的二维数组默认初始化也和一维数组默认的一致

方式②

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

//这里的1,2会放入第一行数组
//而4,5会放入第二行数组

注意:二维数组的初始化的行可以省略,但是列不可以

int arr[][4]

//right

int arr[4][]

//error

2.3二维数组的使用

类比一维数组,二维数组的使用也是通过下标的方式:

二维数组会优先充填第一行的元素。例如:

int main()
{
 int arr[3][4] = {0};
 int i = 0;
 for( i = 0; i<3; i++ )
 {
   int j = 0
   for( j = 0; j<4; j++)
   {
    arr[i][j] = i*4+j;
   }
  }
}

//这里会优先充填第一行的四个元素

2.4二维数组在内存中的存储

二维数组的地址其实是按行依次排序。第一行先排序然后第二行挨着第一行末尾元素的地址排序。

和一维数组一样,二维数组的地址也会随着下标的增长而慢慢变大。

例如:

int arr[3][4];

//它们的地址如下:
//&arr[0][0] = 005DFA48
//&arr[0][1] = 005DFA4C
//&arr[0][2] = 005DFA50
//&arr[0][3] = 005DFA54
//&arr[1][0] = 005DFA58
//&arr[1][1] = 005DFA5C
//&arr[1][2] = 005DFA60
//&arr[1][3] = 005DFA64
//&arr[2][0] = 005DFA68
//&arr[2][1] = 005DFA6C
//&arr[2][2] = 005DFA70
//&arr[2][3] = 005DFA74

三、数组作为函数参数

注意,数组名是首元素的地址。

也就是说当我们

使用数组作为函数参数的时候,应该传递的类型是指针。

int arr[ ] 等价于 int *arr.

但是需要提一嘴的是:

sizeof(数组名)计算的是整个数组;

&+数组名,取出的是数组的地址;

除了以上两种情况外,所有的数组名都表示数组首元素的地址。


 

你可能感兴趣的:(c语言,开发语言)