C语言中数组传入bzero、read为何不需要加&按引用传递?
C语言数组传参的隐式转换规则解答
核心知识点
- 在C语言标准中,除了
sizeof运算、&取地址运算、以及用字符串字面量初始化数组这三类特殊场景外,数组名会自动隐式转换为指向数组首元素的指针。 - 你示例中
buffer是char[256]类型,直接作为参数传递时会自动转换为char*类型,正好匹配bzero和read的参数类型要求:bzero原型:void bzero(void *s, size_t n);read原型:ssize_t read(int fd, void *buf, size_t count);
关于加&的误区
如果你给buffer加上&取地址符,得到的是char (*)[256]类型(指向长度为256的char数组的指针),虽然它的内存地址数值和数组首元素地址一致,但指针类型并不匹配函数要求的通用指针类型,属于不规范的写法,部分严格的编译器会抛出类型不匹配的警告。
示例代码正确性说明
你看到的教程代码是完全符合C语言规范的:
char buffer[256]; bzero(buffer, 256); // 隐式转换为char*,参数类型匹配 n = read(newsockfd, buffer, 255); // 隐式转换为char*,参数类型匹配
内容的提问来源于stack exchange,提问作者Gabriel Lins
相关产品推荐
相关产品推荐

