【问题标题】:C pass by reference without ampersand [duplicate]C不带&号的引用传递[重复]
【发布时间】:2021-11-08 23:08:00
【问题描述】:

我正在学习 C 中的套接字教程,我遇到了这个:

char buffer[256];
bzero(buffer, 256);
n = read(newsockfd, buffer, 255);

但是,据我所知,buffer 变量不应该通过引用(使用 &)传递给 bzero 和 read 函数吗?同样,bzero 和read 的手册页指定这些参数是指针。我错过了什么吗?

【问题讨论】:

  • 行char buffer[256]; 在堆栈上分配大小为256*sizeof(char) 的数组,并为变量buffer 分配指向数组开头的指针。这意味着buffer is of type char*`,这是那些系统调用想要的。
  • @Paul 请不要传播数组是指针的神话。
  • 您不能在 C 中传递数组,该数组会衰减为指向其第一个元素的指针。
  • 顺便说一句,我很确定 bzero 是一个已弃用的 POSIX 函数,您应该改用 memset(buffer, 0, 256)。
  • @mediocrevegetable1 谢谢!我确实注意到了一些奇怪的事情,对 memset 做同样的事情。但是,不是我的代码,它来自教程。

标签: arrays c pointers pass-by-reference implicit-conversion


【解决方案1】:

变量缓冲区被声明为具有数组类型

char buffer[256];

表达式中使用的数组指示符被隐式转换(极少数例外)为指向其第一个元素的指针。

函数bzero改变数组元素buffer所以实际上由于上述隐式转换,数组的所有元素都通过指向数组第一个元素的指针通过引用传递给函数

bzero(buffer, 256);

因此,该函数可以使用传递的指针和指针算法访问和更改数组的任何元素。

【讨论】:

    【解决方案2】:

    当你用数组调用函数时,

    char buffer[256];
    bzero(buffer, sizeof buffer);
    

    数组衰减为指针:

    void bzero(char *buffer, size_t len) {
        //...
    }
    

    另一方面,如果您获取数组的地址:

    foo(&buffer);
    

    匹配函数必须具有如下签名:

    void foo(char(*buffer)[256]) {
        // ...
    }
    

    后者非常少见,因为它只接受一定大小的数组。

    【讨论】:

      【解决方案3】:

      C 没有通过引用传递。你不能在 C 中通过引用传递事物。你只能通过值传递。

      这里传递的值是指向buffer 中第一个对象的指针。这就是bzero 或read 所需要的,因为数组总是占用一块连续的内存。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-28
        • 2023-03-07
        • 2015-11-28
        • 2023-03-03
        • 1970-01-01
        • 2012-01-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多