数组

数组

当你定义一个变量的时候,它在内存中的存储空间是随机的,而当你定义一个数组时,它在内存中的存储空间是连续的.
数组的创建以及初始化
数组的创建
记住,数组是相同类型元素的集合
数组的创建方式
int arr[const_n]
//int 是数组的元素类型
//arr是数组的名字
//const_n表示的是一个常量表达式,即在定义数组的过程中,输入的必须为一个常量,而不能为一个变量
下面这段代码就是行不通的
int main()
{
int num=5;
int arr[num];
}
当我们将代码改为如下形式时
int main()
{
const int num=5;
int arr[num];
}
运行之后我们可以发现这段代码在文件是c语言的情况之下是报错的,但是文件后缀,即为c++的文件之下是运行正常的.
或者我们写为
define num 5
int main()
{
int arr[num];
}
这种情况之下,编译运行也是成功的.
或者使用枚举的方法
enum
{
num=5
}
int main()
{
int arr[num];
}
这种情况之下编译运行也是成功的
所以c语言中有4中方式来定义常量
定义常量 直接定义一个常量
通过const 但是这种方法在c语言中会报错,在cpp的情况之下是正常运行
通过宏来定义 define+你要定义的常量
通过枚举法来定义 enum{你要定义的常量}
//在c语言中定义一个变量后,一定要及时的对其进行初始化
//严禁使用未初始化的变量
//当你使用了未初始化的变量的时候.这种行为称为"未定义行为"(undefind behavior)简称UB
//所以在定义一个变量之后,一定要及时对其进行初始化
#include<stdio.h>
#include<windows.h>
int main()
{
int arr[7] = { 0,1,2,3,4,5,6 };
for (int i = 0; i < 7; i++)
{
//此处为使用数组的下标
//要注意区分与前面数组定义时[]内必须为一个常量
printf("%d", arr[i]);
}
system(“pause”);
return 0;
}
当我们在数组定义的{}中写上0时
则输出结果如下图所示:
数组
当我们在{}中写上1,2时输出的结果如下图所示
数组
我们可以看到这种写法定义了数组的第0项和数组的第1项
注意在数组初始化时,要按照数组的大小,来传入一定的元素
//也可以在数组初始化时,不写明数组的大小,按照后面元素的多少来确定数组的大小
#include<stdio.h>
#include<windows.h>
int main()
{
//当我们在数组定义时在 {}中写上1,2时
int arr[] = { 1,2 ,3,4,6,7};
for (int i = 0; i < 6; i++)
{
//此处为使用数组的下标
//要注意区分与前面数组定义时[]内必须为一个常量
printf("%d", arr[i]);
}
system(“pause”);
return 0;
}
定义一个字符型的数组
如果我们在其中加入数字会出现什么样的情况呐
数组
#include<stdio.h>
#include<windows.h>
int main()
{
//定义一个字符串数组,尝试传入一个数字
char arr[] = { ‘a’,98,‘b’ };
for (int i = 0; i < 3; i++)
{
printf("%d\n", arr[i]);
}
system(“pause”);
return 0;
}
我们可以看到程序是运行成功的,其实本质上的原因还是因为字符本质上也是一个数字它在计算机内部对应的是一个ASCII码值也就是一个数字,但是注意 这种情况不推荐,这种隐式转换只能在c语言中进行.
烫烫烫
//字符数组以及c风格字符串
#include<stdio.h>
#include<windows.h>
int main()
{
//创建一个字符串数组
char arr1[] = { ‘a’,‘b’,‘c’ };
//创建一个c风格字符串
char arr2[] = “abc”;
//打印
//此处的%s输出的为字符串
//%p为取地址符号
printf("%s\n", arr1);
printf("%s\n", arr2);
printf("%d\n", sizeof(arr1));
printf("%d\n", sizeof(arr2));
getchar();
return 0;
}
运行结果如下图所示
数组
分析:在字符串数组中,数组的执行规律为,它会遍历整个数组,当遇到’\0’时,数组就会执行结束,’\0’就是对应的ACII码为0的数
因为在字符串数组中,abc之后的内容都是未知的,所以它才会输出烫烫烫
我们也可以观察字符串数组c风格的字符串,可以发现一个的长度为3,一个的长度为4.所以可以说明c风格的字符数组是自带’\0’的.
二维数组的创建及其初始化
二维数组本质上就是一个一维数组,但是它其中每个元素也是一个一维数组
三维数组本质上就是一个一维数组,但是它其中每个元素也是一个二维数组
四维数组本质上就是一个一维数组,但是它其中的每个元素也是一个三维数组
//对int[3][4]的理解
#include<stdio.h>
int main()
{
//创建一个二维数组
//长度为3,每个元素的长度为4的数组
int arr[3][4] = { 1,2,3,4 };
return 0;
}
数组
我们可以看到鼠标所指的地方,可以看到由三部分组成,第一部分被初始化为了{1,2,3,4},其余的部分都为0
所以可以说明这个二维数组中的3表示的是数组的长度为3,而后面的4表示的是,每个元素所占的的空间为4
当我们把数组定义为这种情况时,猜测一下会出现什么样的结果
#include<stdio.h>
int main()
{
//创建一个二维数组
//长度为3,每个元素的长度为4的数组
int arr[3][4] ={ { 1, 2 }, { 3, 4 }};
return 0;
}
数组
我们可以看到光标所指的地方,数组变成了{1,2,0,0}{3,4,0,0}{0,0,0,0}
所以这种写法,可以定义数组不同的元素
第三种写法
我们可以省略第一个括号中的内容,观察输出的结果
数组
我们可以看到光标所指的位置,这样的写法是不写数组的长度,数组自动检测了数组的长度并进行了赋值
当我们尝试将括号中第二个数字进行省略时,发现编译器报错
所以我们的得出以下结论
对于一维数组括号内的内容是可以省略的,让编译器自动去检测数组的长度
对于二维数组第一个括号内的内容是可以省略的,但是省略之后,与一维数组相同,编译器会按照后面大括号中数组的内容来确定数组的长度,而第二个括号中的内容是不能进行省略的,省略之后编译器就会报错
二维数组在内存中的存储
//对int[3][4]的理解
#include<stdio.h>
int main()
{
//创建一个二维数组
//长度为3,每个元素的长度为4
int arr[3][4] = { 1,2,3,4 };
//创建一个二重循环,来遍历这个数组
//记住,以后行用row表示,列用col表示
//记住数组都是从第0个元素开始数起,所以row和col都是从0开始,表示0行0列
for (int row = 0; row < 3; row++)
{
for (int col = 0; col< 4; col++)
{
printf("%d\n", arr[row][col]);
}
}
getchar();
return 0;
}
输出结果如下
数组
这儿需要注意二维数组的在内存中的位置也是连续的
只不过数组中从存储时,它的长度是由前面的定义的的数组的类型来决定的