前言
本篇文章主要记录数组的相关概念
主要包括: 数组-- 一维数组-- 二维数组
———————————————————————————————————————————
****正文开始***
一,数组
1.1.数组的定义:
1.2为什么要引入数组
我们知道,我们创建一个变量a,将数字存放在变量a中,我们可以通过这样创建:
int a = 10;
int b = 20;
int c = 30;
假设现在要创建并存放100个,甚至更多数字,我们还能一一列举创建吗,这显然工作量将变得非常巨大,这时我们就用到了一个可以储存相同类型元素的集合-->数组
二,一维数组
2.1.一维数组的创建和初始化
2.1.1数组的创建方式:
type_t arr_name [const_n];
//type_t 是指数组的元素类型
//const_n 是一个常量表达式,用来指定数组的大小
实例:
char ch[10];
int arr[5];
注意:
int n = 10;
int arr2[n];// [] 内应该为常量
c99标准之前不支持使用变量的,只能是常量!
c99中增加了变长数组的概念,允许数组的大小是变量。
而且要求编译器支持C99标准
VS 对C99的支持不够好
2.1.2 数组的初始化
例如:
int arr[10] = { 1,2,3,4,5,6,7,8,9.10 };
int arr2[] = {1,2,3,4};
int arr3[5] = {1,2,3,4,5};
char arr4[3] = {'a',98, 'c'};
char arr5[] = {'a','b','c'};
char arr6[] = "abcdef";
不完全初始化: 剩余元素默认初始化为0
int arr[10] = { 1,2,3 };
int arr[10] = { 0 };
我们也可以用过监视来查看未被初始化的空间:
我们看以下的代码要区分,内存中如何分配,下面四个输出的结果分别是什么?
char arr1[] = { 'a','b','c' };
printf("%d\n", sizeof(arr1));
printf("%d\n", strlen(arr1));
char arr2[] = { "abc" };
printf("%d\n", sizeof(arr2));
printf("%d\n", strlen(arr2));
在代码中我们发现了用到了strlen库函数和sizeof操作符,我们先对他们俩做一个区分
strlen 和 sizeof:
*****strlen: 是一个库函数,计算的是字符串的长度,只能针对字符串 关注的是字符串是否有 '\0'
计算的是'\0'之前的字符的个数
*****sizeof: sizeof 是一个操作符(运算符),sizeof 是用来计算变量所占内存空间的大小的,任何类型都是可以使用
只关注空间的大小,不在乎内存中是否存在'\0'
因此我们再分析这段代码:
我们看到 :
arr1有3个元素,数组的大小是3个字节
arr2有4个元素,数组的大小是4个字节
因此第一个打印结果将会是: 3
因此第三个打印结果将会是: 4
又因为:strlen: 是一个库函数,计算的是字符串的长度,只能针对字符串 关注的是字符串是否有 '\0',计算的是'\0'之前的字符的个数。
因此 arr1 没有字符串 所以第二个将会打印:随机值
arr2有字符串“abc”,长度是3 所以第二个将会打印:3
我们也可以通过监视查看:
因此我们最后看演示结果:
2.2.一维数组的使用
#include <stdio.h>
int main()
{
int arr[10] = { 0 };//数组的不完全初始化
//计算数组的元素个数
int sz = sizeof(arr) / sizeof(arr[0]);
//对数组内容赋值,数组是使用下标来访问的,下标从0开始。所以:
int i = 0;//做下标
for (i = 0; i < 10; i++)//这里写10,好不好?
{
arr[i] = i;
}
//输出数组的内容
for (i = 0; i < 10; ++i)
{
printf("%d ", arr[i]);
}
return 0;
}
在这个问题解决之前我们要了解一下数组的下标
2.2.1 数组的下标
下标:下标是用来访问元素的
数组是使用下标来访问的,下标是从0开始。
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
// 0 1 2 3 4 5 6 7 8 9
int sz = sizeof(arr) / sizeof(arr[0]);
// 40 / 4; 计算数组的元素个数
有了对数组下标的了解,我们就可以分析上述代码
总结:
2.3 一维数组在内存中的存储
接下来我们探讨数组在内存中的存储。
看代码:
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int *p = &arr[0];
// 打印数组的每个元素的地址
int i = 0;
for (i = 0; i < 10; i++) {
printf("&arr[%d] = %p\n", i, &arr[i]);
我们来看演示结果:
我们发现: int 是4个字节
一维数组在内存中是连续存放的
数组随着下标的增长,地址是由低到高变化的
三,二维数组
3.1二维数组的创建和初始化
3.1.1二维数组的创建
//数组创建
int arr[3][4]; // 表示3行4列 12个int元素
char arr[3][5]; // 表示3行5列
double arr[2][4];//表示2行4列
3.1.2二维数组的初始化
//行和列的编号也是从0开始
int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };//先放满一行再到下一行
我们打印就可以看到:
不完全初始化:
int arr[3][4] = { 1,2,3,4,5,6,7};//先放满一行再到下一行,不完全初始化 7后面都是0000
我们通过监视清晰地查看:
如果说我们要查找第2行第3列的元素,我们可以这样写:
printf("%d\n",arr[2][3]);// 第二行第三列的元素
我们分析对照运行结果:
如果想控制某一行地元素,我们可以这样写。
例如我们想每一行的前三3列存放数字:
int arr[3][4] = { {1,2,3},{4,5,6},{7,8,9} };
我们依旧看监视:
我们打印出来:
我们发现依然得到了我们想要的结果。
3.2二维数组的使用
#include <stdio.h>
int main()
{
int arr[3][4] = { 0 };
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 4; j++)
{
arr[i][j] = i * 4 + j;
}
}
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 4; j++)
{
printf("%d ", arr[i][j]);
}
}
return 0;
}
我们查看运行结果:
3.3二维数组在内存中的存储
int main() {
int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
int i = 0;
int j = 0;
for (i = 0; i < 3; i++) {
for (j = 0; j < 4; j++) {
printf("&arr[%d][%d] = %p\n",i,j,&arr[i][j]);
//二维数组的存放也是连续存放的
}
}
return 0;
}
我们来查看运行结果:
通过结果我们可以分析到,其实二维数组在内存中也是连续存储的
****正文结束****
———————————————————————————————————————————
总结
本届内容主要记录了数组的简单介绍,包括了一维数组,二维数组
由于本人的技术水平还有待提高,如果各位读者在阅读过程中发现了错误,请及时指正哦。
如果大家觉得有所收获的话,麻烦点赞+关注 走一波呗 QAQ