数组:数组是一组相同类型元素的集合
一维数组
一维数组的创建和初始化
数组的创建
type_t arr_name [const_n] //type_t是指数组的元素类型 //const_n是一个常量表达式,用来指定数组的大小注:数组创建,[ ]中给一个常量,不能使用变量。
数组的初始化
数组的初始化是指在创建数组的同时给数组的内容一些合理的初始值。
数组的初始化是指在创建数组的同时给数组的内容一些合理的初始值。
int arr1[10] = {1,2,3};//不完全初始化,其余默认为0 int arr2[] = {1,2,3,4}; int arr3[5] = {1,2,3,4,5};//完全初始化 char arr4[3] = {'a','98','c'};//98是b的ASCII值,数组的内容为abc char arr6[] = "abcdef";//数组内容包括abcdef\0对于下列代码要区分,内存中如何分配。
char arr1[] = "abc"; char arr2[3] = {'a','b','c'}; char*p = "abcdef";
一维数组的使用
举例说明:#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() { int arr[10] = {0};//数组的不完全初始化 int i = 0;//下标 for(i=0; i<10; i++)//下标从0开始,直到9,一共十个,不能出现10 { arr[i] = i; } for(i=0; i<10; i++) { printf("%d ",arr[i]); } return 0; }
总结:1.数组是使用下标来访问的,下标是从0开始。
2.数组的大小可以通过计算得到。
int arr[10];
int sz = sizeof(arr)/sizeof(arr[0]);//整个数组的长度比第一个元素的长度,即为整个数组的大小
一维数组在内存中的存储
看代码:#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() { int arr[10] = {0}; int i = 0; for(i=0; i<sizeof(arr)/sizeof(arr[0]); i++) { printf("&arr[%d] = %p\n",i,&arr[i]); } return 0; }输出的结果如下:
仔细观察输出的结果,我们可以知道,随着下标的增长,元素的地址也有规律的递增,可以看出,每次加4.
结论:数组在内存中是连续存放的。
一维数组的指针访问
看代码:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() { int arr[] = {1,2,3,4,5,6,7,8,9,10}; printf("%p\n",arr); printf("%d\n",*arr); return 0; }
结果如图:
由此可见:数组的数组名其实是数组首元素的地址。
如果对这个数组解引,会输出数组首元素的内容。
我们可以通过数组名+整数的运算求出整个数组的地址。(例:arr+1 指下标为1,即第二个元素的地址)
二维数组
二维数组的创建和初始化
//数组的创建 int arr[3][4]; char arr[3][5]; double arr[2][4]; //数组的初始化 int char[3][4] = {1,2,3,4};//不完全初始化,其余默认为0 int char[3][4] = {{1,2},{4,5}}; int char[][4] = {{2,3},{4,5}};
注意:初始化数组时,可以省略行,例如上述代码最后一个例子,但不可以把行和列都省略掉。
二维数组的使用
看代码:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() { int arr[3][4] = {0}; int i = 0;//代表行数 for(i=0; i<sizeof(arr)/sizeof(arr[0]); i++)//注意行数的计算 { int j = 0;//代表列数 for(j=0; j<sizeof(arr[0])/sizeof(arr[0][0]); j++)//注意列数的计算方法 { arr[i][j] = i*4+j; } } for(i=0; i<sizeof(arr)/sizeof(arr[0]); i++) { int j = 0;//上一个j在for循环结束后会自动销毁,这里需要重新定义一个列数 for(j=0; j<sizeof(arr[0])/sizeof(arr[0][0]); j++) { printf("%d ",arr[i][j]); } } return 0; }
切记:二维数组可以被看做是一种特殊的一维数组,它的元素又是一个一维数组。
二维数组在内存中的存储
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() { int arr[3][4]; int i = 0; for(i=0; i<3; i++) { int j = 0; for(j=0; j<4; j++) { printf("&arr[%d][%d] = %p\n",i,j, &arr[i][j]); } } return 0; }
结论:二维数组在内存中是连续存储的。
二维数组的指针访问
看代码:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() { int arr[3][4] = {0}; int *p = &arr[0][0]; int i = 0; for(i=0; i<3*4; i++) { *(p+i) = i; } for(i=0; i<3; i++) { int j = 0; for(j=0; j<4; j++) { printf("%d ",arr[i][j]); } } return 0; }
注:二维数组首元素的地址是指第一行元素arr[0][j]的地址。
重要:1.sizeof(数组名),这里的数组名表示整个数组。
2.&数组名,这里的数组名表示整个数组。
除此之外,所有的数组名都代表首元素的地址。