1. 一维数组的创建和初始化
首先,我们要知道数组是相同类型元素的集合。
1.1 一维数组的创建
type_t arr_name [const_n]; //type_t 是指数组的元素类型 //const_n 是一个常量表达式,用来指定数组的大小
在创建时我们所碰到的问题
1. 数组[]中能不能是一个变量
这是在visual studio 2022中的情况:
在visual studio 2022中我们看见它是不行的,实际上数组[变量]这种语法是c99标准中的,它叫变长数组。很明显,visual studio 2022不支持c99版本。
在支持c99标准的编译器下是可以运行的,并不会报错。
2. 数组创建时可不可以不给数组指定大小
这是不行的,创建的时候必须指定空间大小。,不然会报错。
3. 数组空间太大栈区会放满
4. 补充
int arr[2+3]//这种语法是对的,[]中可以是表达式 char arr1[2 + 3]; int arr2[2 + 3]; int arr3[3 + 2];//加法支持交换律 float arr4[4 + 3]; double arr5[5 + 3]; //以上都是正确的,不用质疑
注意:数组创建,在C99标准之前, [] 中要给一个常量才可以,不能使用变量。在C99标准支持了变长数组的概念,数组的大小可以使用变量指定,但是数组不能初始化
1.2 一维数组的初始化
首先了解初始化和赋值的意思:
int a = 0;//这叫初始化
int n; n = 20;//这叫赋值
初始化是创建变量的同时给定一个数值。
赋值是创建变量之后对这个变量给定一个数值
重点放在初始化是同时进行,赋值是一前一后进行
一维数组初始化常见问题罗列
1. int arr[] = {1,2,3}写法可以吗?
这种写法是可以的。
arr数组中存放的是123,这里没有给定空间大小,数组就自动根据元素个数给定这个数组大小。这个数组的空间大小是12。
2. int arr[10] = {1,2,3,4,5}写法可以吗?
这种写法是没有问题的,这个叫做不完全初始化。
这个数组中存放的是1234500000,说明了初始化不完全,编译器会自动给其初始化为0,这里的数组空间大小是40,原因是我们规定了数组大小。
3. 看看char arr1[] = "abc"和char arr2[] = {‘a’,‘b’,‘c’}的区别
这里我们发现,arr1中有四个元素,arr2中有三个元素,说明arr1的空间大小是4,arr2的空间大小是3。
理解了这点再来看看char arr3[10] = "abc"和char arr4[10] = {‘a’,‘b’,‘c’}的区别:
这里我们看到的是一样的,其实并不是,上面我们已经验证了char arr1[] = “abc”,arr1中包含的是a,b,c,\0,arr2中包含a,b,c,这里虽然arr3和arr4看起来一样,但是不同,arr3中其实是a,b,c,\0,0,0,0,0,0,0,arr4中其实是a,b,c,0,0,0,0,0,0,0,这就能解释为什么不一样的原因了。
2. 一维数组的使用
对于数组的使用我们知道[]是一个下标引用操作符,其实就是数组访问的操作符。我们之前提到一个交换律的概念,如:2+3可以写成3+2,一个双目操作符的两个操作数是可以交换的,数组中的两个操作数在某些场景中也是可以交换的,如:
#include <stdio.h> int main() { int arr[] = { 1,2,3,4,5 }; int i = 0; for (i = 0; i < 5; i++) { printf("%d ", i[arr]); //printf("%d ",arr[i]); } return 0; }
总结:
1.数组是使用下标来访问的,下标是从0开始的。
2.数组的大小可以通过计算得到
int arr[10]; int sz = sizeof(arr)/sizeof(arr[0]);
3. 一维数组在内存中的存储
还是先看现象再看实质;
通过这段代码我们发现地址都是隔4个字节的大小,说明一维数组在内存中是连续存放的。随着数组下标的增长,地址也是由低地址到高地址变化。