> 文档中心 > 一维数组

一维数组

目录

1.数组的定义

2.一维数组的创建

2.1数组的创建方式

2.2数组创建实例

2.3变长数组

3.一维数组的初始化

4.一维数组的使用 

5.一维数组在内存中的存储


1.数组的定义

数组是一组相同类型元素的集合

2.一维数组的创建

2.1数组的创建方式

type_t   arr_name   [const_n]

// type_t 是数组的元素类型,如:int  char  float   

// arr_name 是数组的名字

// const_n 是一个常量表达式,用来指定数组的大小

2.2数组创建实例

int  arr1[10];

//创建了一个整形数组,数组名是arr1,数组的大小是10;

char  arr2[10];

//创建了一个字符形数组,数组名是arr2,数组的大小是10;

请判断以下数组可以正常创建吗?

#includeint main{    int count=10;    int arr[count];    return 0;}

以下是这段代码在VS2019中运行的结果,程序报错,数组的长度必须是一个常量 

 那以下数组可以正常创建吗?

#define _CRT_SECURE_NO_WARNINGS#include#define count  10int main(){int arr[count];return 0;}

 以下是这段代码在VS2019中运行的结果,可以看出,程序没有报错,只产生了一个警告。

警告    C4101    “arr”: 未引用的局部变量    

说明arr这个局部变量已声明但是还没有使用,后面如果使用了警告就会消失;如果声明后一直不用,在编译的时候就会报错:

2.3变长数组

C99中引入了变长数组的概念,变长数组是指用整形变量或表达式声明或定义的数组

变长数组不是指数组的长度可以变化,而是允许数组的大小用变量来指定,变长数组在其生命周期里的长度同样是固定的

如果编译器不支持C99中的变长数组,就不能使用。

注:VS2019不支持变长数组,Linux 系统支持

3.一维数组的初始化

int arr[10] = {1,2,3,4};

//不完全初始化,其余默认为0

//变长数组不能初始化

char ch1[ ] = {'a', 'b', 'c'};

char ch2[ ] = {'a', '98', 'c'};

//98是b的ASCII码值

//不指定大小时,根据初始化内容确定大小

//有些编译器不支持不初始化的操作

局部变量不初始化可能报错,全局变量不初始化值为0,静态变量也为0

栈区:局部变量,形式参数存储的位置

静态区:全局变量,静态变量存储的位置

可以看出,存储在栈区的变量不初始化是随机值,存储在静态区的变量默认初始化为0

字符初始化和字符串初始化数组的不同

 char arr1[ ] = { 'a','b','c'};

//未定义数组大小,初始化放入了a,b,c 三个字符

//sizeof计算的是数组所占内存字节数,三个字符,所以所占字节数为3

//strlen计算的是数组的长度,指\0之前的字符数,arr1 中并未给定\0的位置,所以输出的是随机值,函数计算个数直到遇到\0停下

char arr2[ ] = "abc";

//使用字符串初始化函数时,字符串末尾默认有\0

//sizeof计算数组所占内存字节数,abc\0总共四个字符

//strlen计算的是数组的长度,对于arr2数组的内容:abc\0,\0之前的字符数为3

4.一维数组的使用 

使用循环给数组赋值及输出数组

#define _CRT_SECURE_NO_WARNINGS#include#includeint main(){int arr[10] = { 0 };int i = 0;for (i = 0; i < 10; i++){arr[i] = i;}int j = 0;for (j = 0; j < 10; j++){printf("%d ", arr[j]);}printf("\n");return 0;}

 运行结果如下,将数组内容赋为0~9

5.一维数组在内存中的存储

我们先看以下代码:打印数组各个元素的地址

我们把程序输出的内容列出来(地址用十六进制表示)

&arr[0] = 012FF7B8        //首元素地址
&arr[1] = 012FF7BC        //与arr[0]地址相差4
&arr[2] = 012FF7C0        //与arr[1]地址相差4
&arr[3] = 012FF7C4        //与arr[2]地址相差4
&arr[4] = 012FF7C8        //与arr[3]地址相差4
&arr[5] = 012FF7CC        //与arr[4]地址相差4
&arr[6] = 012FF7D0        //与arr[5]地址相差4
&arr[7] = 012FF7D4        //与arr[6]地址相差4
&arr[8] = 012FF7D8        //与arr[7]地址相差4
&arr[9] = 012FF7DC        //与arr[8]地址相差4

 因为我们创建的数组是整形数组,所以每个元素为四个字节

综上:一维数组在内存中是连续存放的,随着数组下标的增长,地址由低到高变化

关于数组名,我们可以看以下代码:

C语言中规定:数组名一般代表的是数组首元素的地址

由以上代码看出:

&arr和&arr[0]打印的地址是相同的,但是&arr+1和&arr[0]+1打印的地址不同

所以在&arr时数组名不表示首元素

同理:sizeof(arr)=40,而sizeof(arr[0])=4;

所以在sizeof(arr)时数组名不表示首元素