为什么这些会产生相同的结果?
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] 删除。
我来说两句