在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_new1[9];
int nums_new2[11];
int i;
//删除nums第6个元素
for(i=0; i<10; i++){
//i等于6时直接跳过,不进行任何操作
if(i < 6){
nums_new1[i] = nums[i];
}else if(i > 6){
nums_new1[i-1] = nums[i];
}
}
display_array(nums_new1, 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等于6
nums_new2[i] = 55;
nums_new2[i+1] = nums[i];
}
}
display_array(nums_new2, 11);
return 0;
}
运行结果:
display_array() 是一个自己定义的函数,用来输出数组的所有元素;使用 display_array() 时,需要将数组名和数组长度传递给它。读者暂时知道这些即可,之后我们将在《C语言函数》一章中详细讲解。
这段代码总体的思路是使用 for 循环遍历所有的数组元素,并逐个给新的数组元素赋值。这种方法比较简单粗暴,更加高效和简洁的做法是直接复制数组内存,不过由于大家的知识还不充足,所以暂时无法讲解,等大家学了指针以后可以尝试使用 memcpy() 函数来解决。
不能插入和删除数组元素有时候会非常麻烦,比如一个数组保存了某个班级的学生学号,现在有一名学生退学了,就得把 TA 从数组中剔除,但是C语言并不支持这么做,这就给编程带来了不小的麻烦。
数组元素都是紧挨着排布的,中间没有空隙,不管是插入元素还是删除元素,都得移动该元素后面的内存:
插入和删除数组元素都要移动内存,甚至重新开辟一块内存,这是相当消耗资源的。如果一个程序中有大量的此类操作,那么程序的性能将堪忧,这有悖于「C语言非常高效」的初衷,所以C语言并不支持动态数组。
另外,很多时候我们需要把数组的地址保存到一个变量里面(等大家学到指针时就会见到这种情况),如果数组重新开辟了内存,而变量里面的地址不跟着改变的话,后续再使用该变量就会导致错误。让C语言本身去维护这些变量的值,以保持同步更新,这又是不可能做到的,所以这个矛盾无法从根本上解决。
总之,为了保证程序执行效率,为了防止操作错误,C语言只支持静态数组,不支持动态数组。