目录:
一、数组的定义
二、一维数组的创建和初始化。
三、一维数组的使用。
四、一维数组在内存中的存储
五、一维数组的指针访问
六、二维数组的创建和初始化
七、二维数组的使用
八、二维数组在内存中的存储
九、二维数组的指针访问
正文
一、数组的定义
数组是一组相同类型元素的集合。
二、一维数组的创建和初始化
1、数组的创建
type_t arr_name [const_n];
//数组元素类型 + 数组名 + 数组大小(常量表达式)
//正确写法:
int arr[10];//√
int arr[5 + 5];//√
//错误写法:
int n = 10;
int arr[n];//error 方括号内必须是常量或者常量表达式
2、数组的初始化
在创建数组的时候,会给数组一些合理的初始值。
//正确写法:
//1.不完全初始化
int arr[10] = {1,2,3}//前三个元素为1,2,3,后面七个默认为0;
int arr[] = {1,2,3};//通过后面初始化的123可以确定出数组大小为3
//2.完全初始化
int arr[4] = {1,2,3,4};
//错误写法:
int arr[0];//error 创建了一个数组但又是0个元素,模棱两可,
int arr[];//error 没有告诉编译器要创建多大的空间
有关字符数组的创建:
//1、
char arr[3] = { 'a', 98, 'c' };//b的ASCII值为98
char arr2[] = { 'a', 'b', 'c' };//arr arr2 这两数组效果一样
//2、
char arr3[] = "abcdef";//七个元素,隐藏着\0
char arr4[] = { 'a', 'b', 'c','d','e','f' };//6个元素
char *p = "abcdef";//把首字符a的地址放在p,*p则为a;
printf("%s\n", arr3);//abcdef
printf("%s\n", arr4);//abcdef烫烫烫、、、随机值,没有\0 停不下来
printf("%s\n", p);//abcdef
三、一维数组的使用
下标引用操作符: [ ]
int arr[10] = {0};//十个元素初始化成0;
printf("%d\n",arr[0};//打印第一个元素。数组下标从0开始
int sz = 0;//数组的大小
int sz = sizeof(arr)/sizeof(arr[0]);//整个数组大小除以一个元素的大小
四、一维数组在内存中的存储
在数组中。随着下标的增长,元素的地址也有规律的递增,所以在内存中数组是连续存储的。
五、一维数组的指针访问
1、指针的初步介绍
(1)指针可以理解为一个变量,是一个专门用来存放地址的变量
(2)解引用操作:找到指针所指向的变量
int n = 10;
int *p = &n;//把n的地址给p
*p = 20;//解引用操作
2、一维数组的指针访问
int main()
{
int arr[10];
int sz = sizeof(arr)/sizeof(arr[0]);
int *p = arr;//数组名arr表示首元素地址;把首元素地址给指针变量p
for(i=0; i<sz; i++)
{
*(p+i) = i;//*p即为首元素,*(p+i)即为第i个元素
}
for(i=0; i<sz; i++)
{
printf("%d ", *(p+i));
六、二维数组的创建和初始化
1、二维数组的创建
int arr[3][4];//三行四列
char arr1[3][5];//三行五列
double arr2[2][4];//两行四列
2、二维数组的初始化
在初始化的时候注意:
行可以省略,列不可以;
int arr[3][4] = { 1, 2, 3, 4, 5 };
// 1 2 3 4
// 5 0 0 0
// 0 0 0 0
int arr1[3][4] = { { 1, 2 }, 3, 4, 5 };
// 1 2 0 0
// 3 4 5 0
// 0 0 0 0
//int arr2[3][4] = { { 1, 2 }, 3, { 4, 5 } };//error
int arr3[3][4] = { { 1, 2 }, { 3 }, { 4, 5 } };
int arr4[][4] = { { 1, 2 }, { 3 }, { 4, 5 } };//这两数组效果一样
// 1 2 0 0
// 3 0 0 0
// 4 5 0 0
七、二维数组的使用
二维数组的使用类似于一维数组,用下标操作符。
不同于一维数组的是数组元素个数的计算:
行数:sizeof(arr)/sizeof(arr[0]);//整个数组大小除以第一行的大小
列数:sizeof(arr[0])/sizeof(arr[0][0]);//第一行的大小除以第一个元素的大小
八、二维数组在内存中的存储
二维数组在内存中也是连续存放的。
由此图也可以看出,数组在创建的时候不能省略掉列,如果省略到列的个数,就不知道每一行有几个元素,就无法确定第二行的位置。只有每一行的个数确定了,才能计算出下一行放在那里。
九、二维数组的指针访问
int main()
{
int arr[][4] = {{1,2},{3},{4,5}};
int i = 0;
int j = 0;
//int *p = arr;arr是首元素地址,但在二维数组中,arr是第一行的地址
int *p = &arr[0][0];
for(i=0; i<sizeof(arr)/sizeof(arr[0][0]); i++)
{
printf("%d ", *(p+i));
}