为什么在缓冲区位置中用于 fread/fwrite 的数组可以在有或没有 & 的情况下写入并产生相同的结果?

护法

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

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);

在第一个版本中,不会&像第二个版本那样只访问数组的位置,而不是数组本身吗?它是一个有价值的东西吗?我明白为什么&要使用 an ,但我认为数组本身就是一个“指针”,一般来说,所以没有理由再次获取它的地址?在那种情况下只是冗余吗?

来自莫斯科的弗拉德

函数fread声明如下

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

它的第一个参数是非限定类型void *(实际上参数类型是限定类型void * restrict)。指向任何类型的对象的指针都可以分配给 type 的指针void *

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

header用作调用参数的表达式fread被隐式转换为该类型的指针,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]尽管表达式的两个值彼此相等。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章