C语言数组详解——十分钟带你学习数组

每日一句:不为模糊不清的未来担忧,只为清清楚楚的现在努力。

数组

  • 一、一维数组的创建和初始化
    • 1.1 如何创建数组
    • 1.2 数组在全局变量定义和在局部变量定义的区别
  • 二 一维数组
    • 2.1 维数组的下标
    • 2.2 计算数组的元素个数
    • 2.3 给数组赋值
    • 2.4 数组在内存中的存储
  • 三 ,二维数组
    • 3.1二维数组的创建和初始化
    • 3.2 二维数组在内存中的存储
    • 3.3 数组越界

一、一维数组的创建和初始化

1.1 如何创建数组

数组是一些类型相同元素的集合。
数组的创建方式:

类型 数组名[大小];

例:

	int arr[10];//数组的创建

	int x_arr[10] = { 1,2,3,4,5,6,7,8,9,10 };数组的初始化

	char x1_arr[10];

	float x2_arr[10];

	double x3_arr[10];

在C99中,引入了的变长数组的概念。什么是变长数组呢?

	int n = 0;
	scanf("%d", &n);
	int x_4arr[n]//这个就是变长数组。大小由你自己来定。

注:变长数组不能初始化。在一些编译器里是不支持变长数组的使用的。

1.2 数组在全局变量定义和在局部变量定义的区别

在全局变量中定义数组,数组初始值默认为0。
在局部变量中定义数组,数组初始值是随机数。
这就是他们两个的区别,但是不建议在全局变量中定义数组,因为你每次调用这个数组,都可能会改变这个数组的值,说白了,小伙子,你把握不住。
下面是代码实列:
C语言数组详解——十分钟带你学习数组_第1张图片

二 一维数组

2.1 维数组的下标

直接上代码:
代码如下(示例):

	int arr[6] = { 1,2,3,4,5,6};
	printf("%d %d", arr[1], arr[5]);//

这个的结果会是1和5吗?
答案:不是的。
C语言数组详解——十分钟带你学习数组_第2张图片

咦?为什么会是2和6呢?这是因为:数组的下标是从0开始的,你肯定会有疑惑为什么会是从0开始的,个人认为是因为偏移量的概念影响的吧。
所以想要输出1~6,你需要在[]里面填写0 ~5,这样才能把这个数组打印出来。

	for (int a = 0; a < 6; a++)
	{
		printf("%d ", arr[a]);
	}

C语言数组详解——十分钟带你学习数组_第3张图片
所以,在你打印数据的时候要注意!!!

2.2 计算数组的元素个数

话不多说,直接上代码:
代码如下(示例):

#include
int main()
{
	int arr[100];
	int sz = sizeof(arr) / sizeof(arr[0]);
	printf("%d", sz);
	return 0;
}

数组是使用下标来访问的,下标是从0开始的
数组的大小可以通过计算得到,就是上面的sz。

2.3 给数组赋值

数组可以初始化赋值,也可以通过scanf来赋值,

#include
int main()
{
	int arr[10];
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (int a = 0; a < sz; a++)
	{
		scanf("%d", &arr[a]);
	}
	for (int b = 0; b < sz; b++)
	{
		printf("%d ", arr[b]);
	}
	return 0;
}

C语言数组详解——十分钟带你学习数组_第4张图片
这就是用for循环和scanf和printf来输入输出数组arr的值。

2.4 数组在内存中的存储

下面我们来探讨一下一维数组在内存中的存储方式
上代码:

#include
int main()
{
	int arr[10];
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (i; i < sz; i++)
	{
		printf("arr[%d]=%p\n", i, &arr[i]);
	}
	return 0;
}

代码结果如下:
C语言数组详解——十分钟带你学习数组_第5张图片
从这个结果里我们可以看到:随着数组下标的增长,地址也在有规律的增长
所以,数组在内存中是连续存放的。
但它为什么不是一个一个的增加呢?
C语言数组详解——十分钟带你学习数组_第6张图片
这是因为int占四个字节,所以每次加4。
你也可以试试char float类型的哦。

三 ,二维数组

3.1二维数组的创建和初始化

二维数组的创建和初始化其实差不都,只是,二维数组是两个[],第一个[]代表行,第二个[]代表列。
给大家看个代码就知道了

#include
int main()
{
	int arr[3][3];
	int a = 0;
	int b = 0;
	for (a=0; a < 3; a++)
	{
		for (b=0; b < 3; b++)
		{
			scanf("%d", &arr[a][b]);
		}
	}
	for (a=0; a < 3; a++)
	{
		for (b=0; b < 3; b++)
		{
			printf("%d ", arr[a][b]);
		}
		printf("\n");
	}
	return 0;
}

结果展示:
C语言数组详解——十分钟带你学习数组_第7张图片
看,跟一维数组差不多吧!

注:二维数组,行可以省略不写,但列是必须写的。

3.2 二维数组在内存中的存储

跟一维数组一样,把每个地址打印出来,

#include
int main()
{
	int arr[3][3] = { {1,2,3},{1,2,3},{1,2,3} };
	int a = 0;
	int b = 0;
	for (a=0; a < 3; a++)
	{
		for (b=0; b < 3; b++)
		{
			printf("arr[%d][%d]=%p ",a,b ,&arr[a][b]);
		}
		printf("\n");
	}
	return 0;
}

下面看结果
在这里插入图片描述
看,每次都加了4,所以,二维数组在内存中也是连续存储的。

3.3 数组越界

数组的下标是从0开始的,数组有x个元素,那么第x个元素就是x-1
所以当下标小于0或者>x-1,数组就越界了,超出了数组能表示的范围。
所以在写代码的时候,一定要注意,数组是否越界访问了,不要坚定说:我写的代码怎么可能有错误,肯定是编译器错了。玩笑话,哈哈。

#include
int main()
{
	int arr[3][3] = { {1,2,3},{1,2,3},{1,2,3} };
	int a = 0;
	int b = 0;
	for (a=0; a <= 3; a++)//=3就越界访问了
	{
		for (b=0; b <= 3; b++)
		{
			printf("%d ",arr[a][b]);
		}
		
	}
	return 0;
}

C语言数组详解——十分钟带你学习数组_第8张图片
但不知道为什么,编译器没报错。
当出现这种数字的时候,大家要去看看是不是数组越界了哈。

个人认为,学编程,最重要的一点就是多敲,多看,多理解。

你可能感兴趣的:(C语言,c语言)