一维数组
目录
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)时数组名不表示首元素