【问题标题】:When we pass an array to a function, how does the copy work? [duplicate]当我们将数组传递给函数时,副本是如何工作的? [复制]
【发布时间】:2019-01-08 19:57:33
【问题描述】:

我在 K&R C 书中读到,当我们将数组传递给函数时,数组的地址(包含数组第一个元素的地址的指针)被传递给函数,因此看起来像引用传递(尽管 C 中没有这种真正的机制)

但是,下面的内容对我来说没有意义 -

void test(char arr[10]) {
    arr[2] = 'a';
 }

 main() {
     char arr[5] = "hello";
     test(arr);
     printf("%s", arr);
     return 0;
 }

这给了我预期的治疗效果。

但这是否意味着这就是评估的方式?

“char arr[]”参数被分配了指向实际数组的指针?它是如何工作的?

char arr[10] = &arr[0] 

对我来说没有意义!

【问题讨论】:

  • 我看不出矛盾。 “让它看起来像一个传递引用” - 意味着您可以对其进行修改并让结果在函数外部可见。
  • 是的,数组地址的副本作为参数给出。是的,通过这个地址,你确实改变了原来的数组。什么不清楚?
  • 数组在可能的情况下会衰减为指针,其中之一是在将其传递给函数时,因此test(arr);test(&arr[0]);基本相同。
  • 令我困惑的是:我一直是这样想的——当我们将参数传递给函数时,函数定义中的参数和调用函数时的实际参数得到等同于。所以当我们说我们在func定义中有char arr[]但通过&arr[0]时,我无法理解这两者是如何等同的
  • 这是函数的特例。将数组指定为函数参数时,C 语言将参数视为指针类型,而不是数组类型。

标签: c arrays function pass-by-reference


【解决方案1】:

test中参数arr接收参数的地址,因为它是一个数组,不是一个副本,所以你修改arr 在 main 中(在 testmain 中不使用相同的名称更实用:-)

void test(char arr[])void test(int * arr)是两种写法

调用test(arr)test(&arr[0])也是两种写法

【讨论】:

  • 我的困惑在于我们实际上如何将函数签名中定义的数组与从函数调用传递的地址等同起来。他们两个似乎不相容
  • @user3655977 您可以将签名替换为 void test(char * arr) 并且您将拥有完全相同的定义
  • 抱歉,如果我有点厚。你能解释一下,当我们在函数调用中传递一个参数时,它如何等同于函数签名中的函数参数?就像直接分配一样,对吧?但在这种情况下,char arr[] 如何等同于我们传递的&arr[0] 地址?
  • 具有char[]char * 类型与参数等效,只是写相同内容的两种方法。而用 arr&arr[0] 调用 test 也是完全一样的,只是两种写法而已
  • @bruno 即使我将其定义为 void test(char arr[10]),它是否仍会忽略 10 并将其视为只是一个 char 指针?这不是意味着信息丢失(值 10)吗?
猜你喜欢
  • 2016-01-13
  • 2019-01-11
  • 2017-09-18
  • 1970-01-01
  • 1970-01-01
  • 2019-03-29
  • 2011-04-18
相关资源
最近更新 更多