2016-07-18 42 views
3

我已經遇到了一些代碼,我以爲會被打破,但由於工作的東西,我不明白,或者找到解釋。如果有人能讓我直說,我會非常感激。據證實在下面的代碼片斷:陣列的typedef古怪

#include <stdio.h> 

typedef char char_block[16]; 

void f(char_block *b) { 
    printf("block 0x%p - b\n", b); 
    printf("block 0x%p - *b\n", *b); 
} 

main() { 
    char_block b = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 }; 
    f(&b); 
} 

使用克+編譯和執行,此打印:

block 0x0x7fff4794b4e0 - b 
block 0x0x7fff4794b4e0 - *b 

我曾天真地假定

一個參數的聲明爲「」類型「的陣列」應調整到「」合格指針爲類型「」

意味着該功能將等同於

void f(char ** b) 

但是其他的事情正在發生嗎?

+0

該代碼沒有實現一個參數的*聲明,指向]''數組的類型「... *」。 – alk

回答

2

f()參數b具有類型pointer to char_block(指針16字符的數組); *b有類型​​。在大多數情況下,*b的使用將該類型轉換爲指向數組第一個元素(類型爲char*)的指針。

char(*)[16]類型和char*的一些當前C實現值可以安全地被解釋爲void*,它是在型預計%p格式說明。

記住,作爲void*類型的值char(*)[16]char*的解釋並不能完全保證由標準的成功。你應該把這個值保險起來

printf("block 0x%p - b\n", (void*)b); // b has type char(*)[16] 
    printf("block 0x%p - *b\n", (void*)*b); // *b is converted to type char* 
    sizeof *b == 16; // no conversion when used as argument to sizeof operator 
+1

現在有意義 - 解除引用的值別無選擇,只能衰減回指針。非常邪惡。感謝大家的幫助。 – user268385

6

char_block *char (*)[16]