C | 数组的相关知识(一)
目录
- 前言
- 数组的定义
- 数组相关的知识点
-
- 一维数组的创建
- 一维数组的初始化
- 一位数组的使用
- 一位数组在内存中的存储
- 二维数组的创建
- 二维数组的初始化
- 二维数组的使用
- 二维数组在内存中的存储
- 结语
前言 我相信在任何编程语言中,数组都是一个极为重要的数据类型。
而在C语言,数组属于构造类型。
数组的运用十分广泛,因此我们有必要对这一块知识重视。
今天就让我们从零开始学习数组的相关知识吧!
数组的定义 数组就是一组相同数据类型的元素的集合。
数组的元素在内存中是连续存放的。
数组相关的知识点 一维数组的创建 一维数组的创建格式如下:
数据类型 + 数组名 + [ 数组元素的个数 ]代码演示如下:
int arr1[10];
char arr2[10];
float arr3[1];
double arr4[20];
需要注意的是,C99标准之前,C语言的数组在指定大小的时候,是不支持用变量来指定大小的,即使是const修饰的常变量也不行。
代码演示如下:
int count1 = 10;
int arr1[count1];
//这是不允许的const int count2 = 10;
int arr2[count2];
一维数组的初始化 数组的初始化是指,在创建数组的同时给数组的内容一些合理初始值(初始化)。
代码演示如下:
int arr1[10] = {
1,2,3};
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";
注意
数组在创建的时候如果想不指定数组的确定的大小就得初始化。
此时数组会根据初始化的内容来确定数组元素的个数。
但是
字符数组的初始化方式的不同,会导致不同的结果。
char arr1[] = "abc";
char arr2[3] = {
'a','b','c'};
上述代码中,arr1的初始化方式会默认在最后加上‘\0’来作为字符串结束的标志。
此时arr1这个数组的元素个数位4。
而arr2的初始化方式不会在最后加上‘\0’,那么这时候,如果要用strlen函数来求字符串的长度的时候,得到的结果就会是随机值。
一位数组的使用 数组的访问,我们需要用到一个操作符:[ ] ,下标解引用操作符。
当我们要访问数组的元素的时候,需要用到这个操作符号。
注意
当我们访问数组的第一个元素的时候,下标应为0,即arr[ 0 ]。
代码演示如下:
#include
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;
}
小结
数组是使用下标来访问的,下标是从0开始。
数组的大小可以通过计算得到。
一位数组在内存中的存储 数组在内存中的存储是连续的。
代码演示如下:
#include
int main()
{ int arr[10] = {
0 };
int i = 0;
for (i = 0;
i < sizeof(arr) / sizeof(arr[0]);
++i)
{printf("&arr[%d] = %p\n", i, &arr[i]);
}
return 0;
}
当我们执行上面的代码的时候,会得到如下的结果
文章图片
我们可以看到,每一个元素的地址是连续的,而且随着下标的增大,地址也在增大。
每相邻的两个元素的地址,相差的数值等于元素对应的数据类型的大小。
如:上述代码中的数组的元素是整型的,而整型数据的大小是4个字节,所以相邻元素的地址就相差4。
内存图如下:
文章图片
二维数组的创建 二位数组的创建与一维数组的创建相似。
代码演示如下:
int arr[3][4];
char arr[3][5];
double arr[2][4];
其中第一个[ ]表示该数组有多少层 ,第二个[ ]每一层有多少个元素。
二维数组的每一层都可以看成是一个一维数组。
因此,二维数组其实也可以看成是一维数组,而这个数组的每一个元素也是一个一维数组。
【C | 数组的相关知识(一)】(有种套娃的感觉了~)
二维数组的初始化 二维数组的初始化也有几种不同的方式
int arr[3][4] = {
1,2,3,4};
int arr[3][4] = {
{
1,2},{
4,5}};
int arr[][4] = {
{
2,3},{
4,5}};
与一维数组相同,行数可以省略,此时二维数组会根据初始化来确定大小,但是,列不能够省略。
而二维数组初始化的时候,还可以加上{ },方便理解。
二维数组的使用 二维数组的使用与一维数组一样,也是通过下标访问的方式。
代码演示如下:
#include
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;
}
二维数组在内存中的存储 同样是和一维数组的存储方式一样,在内存中是连续的。
代码演示如下:
#include
int main()
{ int arr[3][4];
int i = 0;
for (i = 0;
i < 3;
i++)
{int j = 0;
for (j = 0;
j < 4;
j++)
{printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);
}
}
return 0;
}
上述的代码运行结果如下:
文章图片
由此我们知道,二维数组也是连续存放的,第二层的第一个元素是接着第一层的最后一个元素的。
结语 今天我们就先了解一维数组和二维数组相关的基本知识,关于数组越界和数组传参的内容,我们放在下期哦~
还是那句老话,创作不易呀,希望小伙伴们可以动动小手,给我一个关注、一个赞还有评论哦~
由于本人能力有限,如果有错误的地方,希望大佬们可以指出!
文章图片
推荐阅读
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 一个人的旅行,三亚
- 布丽吉特,人生绝对的赢家
- 慢慢的美丽
- 尽力
- 一个小故事,我的思考。
- 家乡的那条小河
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量