游戏开发工具

C语言数组是静态的,不能插入或删除元素

11 篇文章43 次收藏

在C语言中,数组一旦被定义后,占用的内存空间就是固定的,容量就是不可改变的,既不能在任何位置插入元素,也不能在任何位置删除元素,只能读取和修改元素,我们将这样的数组称为静态数组


反过来说,如果数组在定义后可以改变容量,允许在任意位置插入或者删除元素,那么这样的数组称为动态数组


PHP、JavaScript 等解释型的脚本语言一般都支持动态数组,而 C、C++ 等编译型的语言一般不支持动态数组。


总之,C语言中的数组是静态的,一旦定义后长度就不能改变了,大家要注意这一点,不要尝试去插入或删除元素。


如果由于项目要求,必须要在数组中插入或者删除元素,该怎么办呢?没办法,只能再造一个新数组!


下面的代码演示了数组元素的插入和删除操作:

#include<stdio.h>

//自定义函数,用来输出数组元素
void display_array(int arr[], int len)
{
	int i;
	for(i=0; i<len; i++)
	{
		printf("%d", arr[i]);
	}
	printf("\n");
}

int main()
{
	int nums[10] ={1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
	int nums_nes1[9];
	int nums_new2[11];
	int i;
	
	//删除nums第6个元素
	for(i=0; i<10; i ++)
	{
		//i等于6时直接跳过,不进行任何操作
		if(i <6)
		{
			nums_nes1[i] =nums[i];
		}
		else if(i > 6)
		{
			nums_nes1[i-1] =nums[i];
		}
	}
	display_array(nums_nes1, 9);
	
	//在nums第6个元素后面插入一个整数55
	for(i=0; i<10; i++)
	{
		if(i<7)
		{
			nums_new2[i] =nums[i];
		}
		else if(i > 7)
		{
			nums_new2[i +1] =nums[i];
		}
		else  //i等于7
		{
			nums_new2[i] =55;
			nums_new2[i+1] =nums[i];
		}
	}
	display_array(nums_new2, 11);
	
	return 0;
}

 运行结果:

1 2 3 4 5 6 8 9 10
1 2 3 4 5 6 7 55 8 9 10

C语言数组为什么是静态的

不能插入和删除数组元素有时候会非常麻烦,比如一个数组保存了某个班级的学生学号,现在有一名学生退学了,就得把 TA 从数组中剔除,但是C语言并不支持这么做,这就给编程带来了不小的麻烦。


数组元素都是紧挨着排布的,中间没有空隙,不管是插入元素还是删除元素,都得移动该元素后面的内存:

在第 i 个元素后面插入一个新元素时,第 i 个元素后面的所有元素都要往后移动一个元素的位置,从而给新元素腾出位置来。如果该数组后面紧跟的是其它有用数据,那么为了防止覆盖有用数据,还不敢直接往后移动元素,必须得重新开辟一块内存,把所有的元素都复制过去。

删除第 i 个元素就比较简单了,不管三七二十一,把第 i 个元素后面的所有元素都向前移动即可。


插入和删除数组元素都要移动内存,甚至重新开辟一块内存,这是相当消耗资源的。如果一个程序中有大量的此类操作,那么程序的性能将堪忧,这有悖于「C语言非常高效」的初衷,所以C语言并不支持动态数组。


另外,很多时候我们需要把数组的地址保存到一个变量里面(等大家学到指针时就会见到这种情况),如果数组重新开辟了内存,而变量里面的地址不跟着改变的话,后续再使用该变量就会导致错误。让C语言本身去维护这些变量的值,以保持同步更新,这又是不可能做到的,所以这个矛盾无法从根本上解决。


总之,为了保证程序执行效率,为了防止操作错误,C语言只支持静态数组,不支持动态数组。