C | 数组的相关知识

Posted Ersansui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 = 10int arr2[count2]

一维数组的初始化

数组的初始化是指,在创建数组的同时给数组的内容一些合理初始值(初始化)。

代码演示如下:

int arr1[10] = {1,2,3};
int arr2[] = {1,2,3,4};
int arr3[5] = {12345}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 <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;
}

小结

数组是使用下标来访问的,下标是从0开始。

数组的大小可以通过计算得到。

一位数组在内存中的存储

数组在内存中的存储是连续的。

代码演示如下:

#include <stdio.h>
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];

其中第一个[ ]表示该数组有多少层 ,第二个[ ]每一层有多少个元素。

二维数组的每一层都可以看成是一个一维数组。

因此,二维数组其实也可以看成是一维数组,而这个数组的每一个元素也是一个一维数组。

(有种套娃的感觉了~)

二维数组的初始化

二维数组的初始化也有几种不同的方式

int arr[3][4] = {1,2,3,4};
int arr[3][4] = {{1,2},{4,5}};
int arr[][4] = {{2,3},{4,5}};

与一维数组相同,行数可以省略,此时二维数组会根据初始化来确定大小,但是,列不能够省略。

而二维数组初始化的时候,还可以加上{ },方便理解。

二维数组的使用

二维数组的使用与一维数组一样,也是通过下标访问的方式。

代码演示如下:

#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;
}

二维数组在内存中的存储

同样是和一维数组的存储方式一样,在内存中是连续的。

代码演示如下:

#include <stdio.h>
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;
}

上述的代码运行结果如下:


由此我们知道,二维数组也是连续存放的,第二层的第一个元素是接着第一层的最后一个元素的。

结语

今天我们就先了解一维数组和二维数组相关的基本知识,关于数组越界和数组传参的内容,我们放在下期哦~

还是那句老话,创作不易呀,希望小伙伴们可以动动小手,给我一个关注、一个赞还有评论哦~

由于本人能力有限,如果有错误的地方,希望大佬们可以指出!

以上是关于C | 数组的相关知识的主要内容,如果未能解决你的问题,请参考以下文章

零基础学C语言知识总结十:指针及其相关知识

C语言精华知识:表驱动法编程实践

解释'空'C数组(int a = {};)

C++STL之ACM相关知识大全

几个关于js数组方法reduce的经典片段

几个关于js数组方法reduce的经典片段