type_t arr_name [const_n]
//taype_t为数组类型
//arr_name为数组名字
//const_n为常量大小。在C99标准之前,要为一个常量才可以
//例如:
int a=10;
int arr[a]={0};
//这个在C99标准之前就是不合法的数组创建
我们称创建数组时给数组的内容赋值,称之为初始化
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函数时计算长度的时候就会生成一个随机值。
①数组的下标:
数组的下标是从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]是单个数组元素的大小
数组的元素地址会随着下标的增长而递增。数组在内存中是连续存放的。
譬如:
int arr[5] = {0};
//它们的地址如下
//&arr[0] = 012FFE9C
//&arr[1] = 012FFEA0
//&arr[2] = 012FFEA4
//&arr[3] = 012FFEA8
//&arr[4] = 012FFEAC
//这里地址是以16进制所呈现
类比一维数组,二维数组的创建方式如下:
int arr[3][4];
char arr[3][4]
//均为三行四列的数组
方式①:
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
类比一维数组,二维数组的使用也是通过下标的方式:
二维数组会优先充填第一行的元素。例如:
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;
}
}
}
//这里会优先充填第一行的四个元素
二维数组的地址其实是按行依次排序。第一行先排序然后第二行挨着第一行末尾元素的地址排序。
和一维数组一样,二维数组的地址也会随着下标的增长而慢慢变大。
例如:
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(数组名)计算的是整个数组;
&+数组名,取出的是数组的地址;
除了以上两种情况外,所有的数组名都表示数组首元素的地址。