> 文档中心 > C语言:数组(一)

C语言:数组(一)


什么是数组

顾名思义,数组就是存储相同数据类型的一种类似于容器的东西


一维数组

一维数组的创建和初始化

  • 创建

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];    //errorreturn 0;}

我在VS编译器上编译这段代码后报出以下错误:


其他长见的一些常量可以用来创建数组:

  • #define 定义的常量
#define MAX 10int main(){int arr[MAX];return 0;}

  •  枚举类型定义的常量
enum s{n = 10};int main(){int arr[n];return 0;}

上述两种方式用来创建数组都是可以的。


  • 初始化

在创建数组后可以对其进行初始化,也可以不用初始化,这取决于个人习惯。

#define MAX 10int 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#includeint 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#includeint 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#includeint 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#includeint 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便可以得到数组每个元素的地址,再对地址进行解引用,就可以访问到这个元素。

运行结果如下

松山湖人才网