您当前的位置:首页 > 计算机 > 编程开发 > VC/VC++

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

时间:12-26来源:作者:点击数:

在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;
}

运行结果:

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

display_array() 是一个自己定义的函数,用来输出数组的所有元素;使用 display_array() 时,需要将数组名和数组长度传递给它。读者暂时知道这些即可,之后我们将在《C语言函数》一章中详细讲解。

这段代码总体的思路是使用 for 循环遍历所有的数组元素,并逐个给新的数组元素赋值。这种方法比较简单粗暴,更加高效和简洁的做法是直接复制数组内存,不过由于大家的知识还不充足,所以暂时无法讲解,等大家学了指针以后可以尝试使用 memcpy() 函数来解决。

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

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

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

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

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

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

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

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门