- 前言
- 一,数组
- 二,一维数组
- 三,二维数组
- 总结
前言
本篇文章主要记录数组的相关概念
主要包括: 数组-- 一维数组-- 二维数组
———————————————————————————————————————————
****正文开始***
一,数组 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("%dn", sizeof(arr1));
printf("%dn", strlen(arr1));
char arr2[] = { "abc" };
printf("%dn", sizeof(arr2));
printf("%dn", strlen(arr2));
在代码中我们发现了用到了strlen库函数和sizeof操作符,我们先对他们俩做一个区分
strlen 和 sizeof:
*****strlen: 是一个库函数,计算的是字符串的长度,只能针对字符串 关注的是字符串是否有 ' '
计算的是' '之前的字符的个数
*****sizeof: sizeof 是一个操作符(运算符),sizeof 是用来计算变量所占内存空间的大小的,任何类型都是可以使用
只关注空间的大小,不在乎内存中是否存在' '
因此我们再分析这段代码:
我们看到 :
arr1有3个元素,数组的大小是3个字节
arr2有4个元素,数组的大小是4个字节
因此第一个打印结果将会是: 3
因此第三个打印结果将会是: 4
又因为:strlen: 是一个库函数,计算的是字符串的长度,只能针对字符串 关注的是字符串是否有 ' ',计算的是' '之前的字符的个数。
因此 arr1 没有字符串 所以第二个将会打印:随机值
arr2有字符串“abc”,长度是3 所以第二个将会打印:3
我们也可以通过监视查看:
因此我们最后看演示结果:
2.2.一维数组的使用 对于数组的使用我们之前介绍了 一个操作符: [ ] ,下标引用操作符。它其实就数组访问的操作符。 我们来看代码:#includeint 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; 计算数组的元素个数
有了对数组下标的了解,我们就可以分析上述代码
总结:
1. 数组是使用下标来访问的,下标是从0开始。 2. 数组的大小可以通过计算得到。 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] = %pn", 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("%dn",arr[2][3]);// 第二行第三列的元素
我们分析对照运行结果:
如果想控制某一行地元素,我们可以这样写。
例如我们想每一行的前三3列存放数字:
int arr[3][4] = { {1,2,3},{4,5,6},{7,8,9} };
我们依旧看监视:
我们打印出来:
我们发现依然得到了我们想要的结果。
3.2二维数组的使用 二维数组的使用也是通过下标的方式。 看代码:#includeint 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] = %pn",i,j,&arr[i][j]);
//二维数组的存放也是连续存放的
}
}
return 0;
}
我们来查看运行结果:
通过结果我们可以分析到,其实二维数组在内存中也是连续存储的
****正文结束****
———————————————————————————————————————————
总结
本届内容主要记录了数组的简单介绍,包括了一维数组,二维数组
由于本人的技术水平还有待提高,如果各位读者在阅读过程中发现了错误,请及时指正哦。
如果大家觉得有所收获的话,麻烦点赞+关注 走一波呗 QAQ


![[ C语言 ] 数组-- 一维数组-- 二维数组--(1) [ C语言 ] 数组-- 一维数组-- 二维数组--(1)](http://www.mshxw.com/aiimages/31/433268.png)
