为什么这些产生相同的结果?

uint8_t header[HEADER_SIZE];
fread(&header, sizeof(uint8_t), HEADER_SIZE, input);
fwrite(&header, sizeof(uint8_t), HEADER_SIZE, output);
uint8_t header[HEADER_SIZE];
fread(header, sizeof(uint8_t), HEADER_SIZE, input);
fwrite(header, sizeof(uint8_t), HEADER_SIZE, output);

在第一个版本中,&是否只允许访问数组的位置,而不允许访问第二个版本中的数组本身?如果它是一个有价值的数组,我理解为什么会使用&,但我假设数组本身就是一个"指针",所以没有理由再次获取其地址?在这种情况下只是冗余吗?

推荐答案

函数fread的声明方式如下

size_t fread(void * restrict ptr, size_t size, 
             size_t nmemb, 
             FILE * restrict stream);

其第一个参数具有不合格类型void *(实际上参数类型是合格类型void * restrict).可以将指向任何类型对象的指针指定给类型void *的指针.

表达式&header具有指针类型uint8_t ( * )[HEADER_SIZE],并产生由数组占用的内存范围的初始地址,

用作fread调用的参数的表达式header隐式转换为uint8_t *类型的指针,如果数组占用的内存范围不同,则会生成相同的初始地址.

因此,这些调用

fread(&header, sizeof(uint8_t), HEADER_SIZE, input);
fwrite(header, sizeof(uint8_t), HEADER_SIZE, output);

在函数fread为其参数获取相同值的意义上是等效的.

考虑以下简单的演示程序.

#include <stdio.h>

int main( void )
{
    char s[6] = "Hello";

    printf( "The value of the expression  s is %p\n", ( void * )s );
    printf( "The value of the expression &s is %p\n", ( void * )&s );
}

程序输出可能如下所示

The value of the expression  s is 0x7fffa4577a2a
The value of the expression &s is 0x7fffa4577a2a

正如您所看到的,虽然在第一次调用中,使用的参数表达式的类型为char *,而在第二次调用中,使用的参数表达式的类型为char ( * )[6],但两个输出值都是相等的.

但是,如果您将编写示例

#include <stdio.h>

int main( void )
{
    char s[6] = "Hello";

    printf( "%s\n", s );
    printf( "%s\n", &s );
}

然后,编译器可以为第二次调用printf发出一条消息,表示函数需要char *类型的参数,而不是char ( * )[6]类型的参数,尽管表达式的两个值彼此相等.

C++相关问答推荐

gcc已编译的可执行文件TSB是否同时暗示最低有效字节和最低有效位?

为什么信号量为空= 0,而不是阻塞?

GCC:try 使用—WError或—pedantic using pragmas

为什么我得到更多的256假阳性在PKZIP解密密钥验证?

如何调试LD_PRELOAD库中的构造函数?

有没有可能我不能打印?(C,流程)

如何在C中通过套接字自定义数据类型读取原始变量?

在我的代码中,我需要在哪里编写输出函数?

为什么将函数名括在括号中会禁用隐式声明?

&;(str[i])和(&;str)[i]有什么区别?

如何使解释器存储变量

在移动数组元素时获得意外输出

在txt文件中找到指定的字符串,并从数字中减go 相同的值

获取前2个连续1比特的索引的有效方法

C语言中MPI发送接收字符串时出现的分段错误

将非连续物理内存映射到用户空间

赋值两侧的后置增量,字符指针

macos/arm64 上地址空间不使用第一位吗?

OpenGL 中的非渐变 colored颜色 变化

如何在 C 中编辑 struct 体中的多个变量