C | 数组的相关知识

Posted Ersansui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C | 数组的相关知识相关的知识,希望对你有一定的参考价值。

前言

上次,我们了解了一维数组和二维数组的创建、初始化和使用,那么今天我们就继续学习与数组相关的知识吧~~

数组越界

我们都应该知道,数组的下标是有范围限制的。

数组的下标规定是从0开始的。如果数组一共有n个元素的话,那么下标最大值为n-1,也就是说数组最后一个元素就是下标为n-1的元素。

但是,如果我们访问数组的时候,如果访问下标大于n-1或者小于0的元素,此时我们就访问到了超出数组合法范围的空间,这就叫做数组越界访问。

需要我们注意的是,C语言本身是不会对数组下标进行检查的,而编译器也不一定会报错。

有的编译器会报错,而有的编译器就不会报错。

当数组越界时,编译器不报错就不代表着我们写的代码没有问题,我们作为程序员,一定要做好检查,防止出现数组越界的情况。

下面的错误就是我们初学者容易犯的错误:

#include <stdio.h>
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int i = 0;
	for (i = 0; i <= 10; i++)
	{
		//当i等于10的时候,越界访问了
		//下标从0到n一共有11个元素
		printf("%d\\n", arr[i]);//当i等于10的时候,越界访问了
	}
	return 0;
}

数组传参

在我们写代码的时候,往往会需要将一个数组作为参数传给一个函数,那么此时,我们就会很容易犯错误。

以冒泡排序为例:

#include <stdio.h>

//定义一个函数实现冒泡排序
void bubble_sort(int arr[])
{
	int sz = sizeof(arr) / sizeof(arr[0]);//这样对吗?
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		for (j = 0; j < sz - i - 1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
}


int main()
{
	int arr[] = { 3,1,7,5,8,9,0,2,4,6 };
	bubble_sort(arr);
	for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

不知道小伙伴们觉得上面的代码是否能够成功呢?

答案是否定的。通过调试我们可以知道,函数内部的sz的值为1(32位环境下),为什么会这样呢?

因为数组传参后,数组名表示首元素的地址,地址的大小就是4个字节或者8个字节。

因此我们有必要记住一个结论

结论

1.数组名在大多数情况下代表首元素的地址

2.只有两种情况例外,一是&数组名,二是sizeof(数组名)

&数组名,取出的是数组的地址。&数组名,数组名表示整个数组。

sizeof(数组名),计算整个数组的大小,sizeof内部单独放一个数组名,数组名表示整个数
组。

因此,我们需要对上面冒泡排序的代码进行一下的修改:

void bubble_sort(int arr[], int sz)//参数接收数组元素个数
{
	//代码同上面函数
}

int main()
{
	int arr[] = { 3,1,7,5,8,9,0,2,4,6 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr,sz);
	for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

小伙伴们一定要记住,在函数内部是不可以通过传参得到的数组名来求数组的大小的!

字符数组

字符数组与字符串

在C语言中没有字符串这一数据类型,所以在我们需要存放字符串的时候,需要使用字符数组存放。

在我们使用字符数组来存放字符串的时候,要记住字符串后面一般会加上一个‘\\0’来作为字符串结束的标志,因此在存放字符串的时候,要保证字符数组的长度至少要比其存放的字符串的长度大1。

字符串的输出

字符串的输出可以通过逐个字符的方式输出也可以通过字符串的方式输出。

代码演示如下:

//方法一
char arr[10] = "hello!";
int i = 0;
for( i = 0; arr[i] != '\\0'; i++)
{
	printf("%c",arr[i]);
}
 
//方法二
char arr[10] = "hello!";
printf("%s",arr);

//方法三
char arr[10] = "hello!";
printf(arr);

字符串的输入

字符串的输入同样有多种方法。

可以通过逐个字符的方式来输入也可以通过%s的方式输入

代码演示如下:

//方法一
char arr[20] = { 0 };
int i = 0;
for (i = 0; arr[i] = getchar() != '\\n'; i++)
{
	;
}
arr[i] = '\\0';


//方法二
char arr[20] = { 0 };
scanf("%s", arr);

结语

好啦,有关数组的知识到这里就差不多结束啦!

如果还有那些知识没有提到或者说错了的,欢迎在评论区留言哦~

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

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

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

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

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

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

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

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

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