一、在C语言中,数组一旦被定义后,占用的内存空间就是固定的,容量就是不可改变的,既不能在任何位置插入元素,也不能在任何位置删除元素,只能读取和修改元素,我们将这样的数组称为静态数组。反过来说,如果数组在定义后可以改变容量,允许在任意位置插入或者删除元素,那么这样的数组称为动态数组。
1、PHP、JavaScript 等解释型的脚本语言一般都支持动态数组,而 C、C++ 等编译型的语言一般不支持动态数组。
2、总之,C语言中的数组是静态的,一旦定义后长度就不能改变了,大家要注意这一点,不要尝试去插入或删除元素。

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

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

1 #include <stdio.h>
 2 //自定义函数,用来输出数组元素
 3 void display_array(int arr[], int len){
 4     int i;
 5     for(i=0; i<len; i++){
 6         printf("%d ", arr[i]);
 7     }
 8     printf("\n");
 9 }
10 int main()
11 {
12     int nums[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
13     int nums_new1[9];
14     int nums_new2[11];
15     int i;
16    
17     //删除nums第6个元素
18     for(i=0; i<10; i++){
19         //i等于6时直接跳过,不进行任何操作
20         if(i < 6){
21             nums_new1[i] = nums[i];
22         }else if(i > 6){
23             nums_new1[i-1] = nums[i];
24         }
25     }
26     display_array(nums_new1, 9);
27    
28     //在nums第6个元素后面插入一个整数 55
29     for(i=0; i<10; i++){
30         if(i < 7){
31             nums_new2[i] = nums[i];
32         }else if(i > 7){
33             nums_new2[i+1] = nums[i];
34         }else {  //i等于6
35             nums_new2[i] = 55;
36             nums_new2[i+1] = nums[i];
37         }
38     }
39     display_array(nums_new2, 11);
40    
41     return 0;
42 }

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

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

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

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

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

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

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