C 不带符号的引用传递
C pass by reference without ampersand
我正在学习 C 语言的套接字教程,我遇到了这个:
char buffer[256];
bzero(buffer, 256);
n = read(newsockfd, buffer, 255);
但是,据我所知,buffer
变量不应该通过引用(使用 &)传递给 bzero
和 read
函数吗?同样,bzero and read 的手册页指定这些参数是指针。我错过了什么吗?
C 没有引用传递。你不能在 C 中通过引用传递东西。你只能通过值传递。
此处传递的值是指向buffer
中第一个对象的指针。这就是 bzero
或 read
所需要的,因为数组总是占用连续的内存块。
当您使用数组调用函数时,
char buffer[256];
bzero(buffer, sizeof buffer);
数组衰减为指针:
void bzero(char *buffer, size_t len) {
//...
}
如果你另一方面获取数组的地址:
foo(&buffer);
匹配函数必须具有如下签名:
void foo(char(*buffer)[256]) {
// ...
}
后者很少见,因为它只接受特定大小的数组。
变量 buffer 声明为数组类型
char buffer[256];
表达式中使用的数组指示符被隐式转换为指向其第一个元素的指针(极少数情况除外)。
函数bzero
改变了数组的元素buffer
所以实际上数组的所有元素都通过指向数组第一个元素的指针通过引用传递给函数,因为上面提到的隐式转换
bzero(buffer, 256);
因此,该函数可以使用传递的指针和指针算法访问和更改数组的任何元素。
我正在学习 C 语言的套接字教程,我遇到了这个:
char buffer[256];
bzero(buffer, 256);
n = read(newsockfd, buffer, 255);
但是,据我所知,buffer
变量不应该通过引用(使用 &)传递给 bzero
和 read
函数吗?同样,bzero and read 的手册页指定这些参数是指针。我错过了什么吗?
C 没有引用传递。你不能在 C 中通过引用传递东西。你只能通过值传递。
此处传递的值是指向buffer
中第一个对象的指针。这就是 bzero
或 read
所需要的,因为数组总是占用连续的内存块。
当您使用数组调用函数时,
char buffer[256];
bzero(buffer, sizeof buffer);
数组衰减为指针:
void bzero(char *buffer, size_t len) {
//...
}
如果你另一方面获取数组的地址:
foo(&buffer);
匹配函数必须具有如下签名:
void foo(char(*buffer)[256]) {
// ...
}
后者很少见,因为它只接受特定大小的数组。
变量 buffer 声明为数组类型
char buffer[256];
表达式中使用的数组指示符被隐式转换为指向其第一个元素的指针(极少数情况除外)。
函数bzero
改变了数组的元素buffer
所以实际上数组的所有元素都通过指向数组第一个元素的指针通过引用传递给函数,因为上面提到的隐式转换
bzero(buffer, 256);
因此,该函数可以使用传递的指针和指针算法访问和更改数组的任何元素。