关于#c语言#的问题:c语言中数组名做函数参数时,主调函数和被调函数是如何分配存储单元的,是否共用同一段存储单元

c语言中数组名做函数参数时,主调函数和被调函数是如何分配存储单元的,是否共用同一段存储单元。

数组名作为参数,传递的实际上是指针,也就是说共享同一个内存,被调函数不会分配内存。

看对应的汇编代码

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7601555
  • 这篇博客你也可以参考下:【c】在C语言中使用顺序表了实现一个通讯录,实现对联系人信息的增删改查(主要用到动态开辟内存,文件读写,结构体指针)
  • 你还可以看下c语言参考手册中的 c语言-内存模型与数据竞争
  • 除此之外, 这篇博客: 详细讲解:C语言删除数组中的某一值的所有元素中的 具体要求是这样的,通过键盘向程序输入数组中需要删除的数字,程序接到输入后删除数组中所有需要删除的数字。例如: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    数组 a[10]={1,2,4,6,4,8,6,2,6,7}
    删除数字 :6 
    输出结果:1 2 4 4 8 2 7
    

    想要实现这个功能,其基本思想其实很简单:检索数组,如果遇到与输入值相同的元素,则删除该元素。至于删除数组中的元素,就只需要把数组从中断处挨个往前移一位就好了。

    但数组中要是出现多个相同的数字,就需要我们进行进一步的考虑了,元素的下标问题。
    思路如下:
    首先使用for循环对数组进行遍历,当遇到数组元素与需要删除的数字相同时,从该处起,将下标+1.假设我们输入的数字为:6,用for循环的变量i来遍历数组,则情况如下:

    输入:x 为 6
    下标  0 1 2 3 4 5 6 7 8 9     
    元素  1 2 4 6 4 8 6 2 6 7
    
    当i = 3 时,x = a[i] = 6,则数组a[10]从下标3开始,依次+1直到a[8](数组中第九个元素),即:
    
    下标  0 1 2 3 4 5 6 7 8 | 9     i = 3
    元素  1 2 4 4 8 6 2 6 7 | 7
    

    可以看见数组中第一个6已经消失了,因为数组最高下标就是a[9],所以a[9] 不能再+1,因此我们的+1操作最多只加到a[8].
    因为 a[9] 的值已经赋给了 a[8],所以a[9] 已经可以舍去(否则就会重复),所以目前数组中有效部分是a[0]-a[8]九个元素。

    当i = 5 时,x = a[i] = 6,则数组a[10]从下标5开始,依次+1直到a[7](数组中第八个元素),即:
    
    下标  0 1 2 3 4 5 6 7 | 8 9     i = 5
    元素  1 2 4 4 8 2 6 7 | 7 7
    

    数组中第二个6也消失了,数组的有效部分为a[0]-a[7]八个元素。

    当i = 6 时,x = a[i] = 6,则数组a[10]从下标6开始,依次+1直到a[6](数组中第七个元素),即:
    
    下标  0 1 2 3 4 5 6 | 7 8 9     i = 6
    元素  1 2 4 4 8 2 7 | 7 7 7
    

    至此,数组中的所有的6都已经被删除了,留下了从 a[0]到a[6] 七个有效元素。
    因此我们打印时只需要打印前面7位就可以了,不难看见,减去的这几位正好是 “6” 出现的次数,因此我们只需要再设置一个标记,每次要求删除的数字出现时就自+1,最后输出时用数组长度减去这个标记数字,就能把有效的元素全部输出了。

  • 您还可以看一下 CSDN讲师老师的C语言精髓之编译过程视频教程课程中的 计算机的组成部分,栈内存的特点;画出内存图,引入指针的概念小节, 巩固相关知识点

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^