什么是数组?
顾名思义,数组就是存储相同数据类型的一种类似于容器的东西
一维数组
一维数组的创建和初始化
-
创建
int arr[10];
创建数组时必须定义数组元素的类型以及数组的大小。
上述代码定义了可以存储10个int 类型的数组。
数组创建时方括号中必须是常量,不能是变量。
例如下述代码
int main()
{
int n=10;
int arr[n];
//error
return 0;
}
这段代码中,n是变量不能用来创建数组,所以错误。
那有人问,用const 修饰的变量可以视为常量,可以用来创建数组码?答案是不行,虽然用const 修饰,但是它的本质啊还是变量,依然不能用来创建数组。
int main()
{
const int n = 10;
int arr[n];
//error
return 0;
}
我在VS编译器上编译这段代码后报出以下错误:
其他长见的一些常量可以用来创建数组:
- #define 定义的常量
#define MAX 10
int main()
{
int arr[MAX];
return 0;
}
- 枚举类型定义的常量
enum s
{
n = 10
};
int main()
{
int arr[n];
return 0;
}
上述两种方式用来创建数组都是可以的。
-
初始化
在创建数组后可以对其进行初始化,也可以不用初始化,这取决于个人习惯。
#define MAX 10
int main()
{
int arr1[MAX] = { 0,1 };
int arr2[MAX] = { 0,1,2,3,4,5,6,7,8,9 };
return 0;
}
初始化可以进行局部初始化,例如arr1数组,也可以进行全部初始化,例如arr2。
局部初始化的数组arr1,除了前两个数之外,其他的默认为0。
没有进行初始化的数组,里面会放入随机内容。
一维数组在内存中的存储
数组在内存中是连续存放的。
我们可以创建一个数组,依次打印出数组中每个元素的地址。
#define MAX 10
#include<stdio.h>
int main()
{
char arr[MAX];
int i = 0;
for (i = 0; i < MAX; i++)
{
printf("&arr[%d] = %p\n", i,&arr[i]);
}
return 0;
}
定义了一个有10个char 类型的数组,每个char 类型在内存中占据1个字节,打印出每个元素的地址可以发现,彼此元素的地址之间相差1个字节,因此,数组的元素在内存中是连续存放的。
一维数组的访问
下标引用操作符访问
#define MAX 10
#include<stdio.h>
int main()
{
int arr[MAX] = { 0,1,2,3,4,5,6,7,8,9 };
int i = 0;
for (i = 0; i < MAX; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
数组的下标从0开始(也就是第一个元素的下标),依次往后+1。
上述代码就遍历了一遍数组,打印出了数组的元素,运行结果如图:
地址访问
数组名是首元素的地址,我们可以以下代码来证明
#define MAX 10
#include<stdio.h>
int main()
{
char arr[MAX];
if (&arr[0] == arr)
{
printf("&arr[0] and arr are same\n");
}
else
{
printf("&arr[0] and arr are not same\n");
}
}
运行结果如下
因此数组名表示数组首元素的地址。
那么如何通过地址来访问数组元素的?
#define MAX 10
#include<stdio.h>
int main()
{
int arr[MAX] = { 0,1,2,3,4,5,6,7,8,9 };
int i = 0;
for (i = 0; i < MAX; i++)
{
printf("%d ", *(arr + i));
}
}
数组名表示首元素的地址,而且数组元素在内存中又是连续存放的,所以让arr依次+1便可以得到数组每个元素的地址,再对地址进行解引用,就可以访问到这个元素。
运行结果如下