為什么這些會產生相同的結果?
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 ,但我認為陣列本身就是一個“指標”,一般來說,所以沒有理由再次獲取它的地址?在這種情況下只是冗余嗎?
uj5u.com熱心網友回復:
函式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]盡管運算式的兩個值彼此相等。
uj5u.com熱心網友回復:
header是一個陣列char。將陣列作為引數傳遞有效地將指標傳遞給它的第一個元素,fread并fwrite接受指標void作為它們的第一個引數,所以fread(header, sizeof(uint8_t), HEADER_SIZE, input);很好,盡管為了與陣列定義保持一致,這樣寫會更安全:
fread(header, sizeof(*header), HEADER_SIZE, input);
&header具有不同的型別:指向一個或多個HEADER_SIZE字符陣列的指標 ( uint8_t (*)[HEADER_SIZE])。由于fread接受任何型別的指標,編譯器將在fread(&header, sizeof(uint8_t), HEADER_SIZE, input);沒有警告的情況下接受呼叫。
因為header和&header具有相同的地址,fread將按預期運行,盡管 C 標準不保證這種行為。但是請注意,如果header是指向 的指標char,則傳遞&header會產生非常不同的結果,實際上是未定義的行為,因為指標的值將被覆寫,并且可能超出...
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/490430.html
上一篇:三.js影片圖層蒙版
下一篇:使用指標將值插入二維陣列
