我发现了一些我认为已被破坏的代码,但由于我无法理解或找到解释而起作用。如果有人能帮我直截了当,我将非常感激。它在以下片段中进行了演示:
#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);
}
使用g +编译并执行,打印:
block 0x0x7fff4794b4e0 - b
block 0x0x7fff4794b4e0 - *b
我天真地认为
将参数声明为''类型数组''应调整为''限定指向类型''
意味着该功能与
无关void f(char ** b)
但是还有其他事情发生在这里?
答案 0 :(得分:6)
char_block *
是char (*)[16]
。
答案 1 :(得分:2)
在f()
中,参数b
的类型为pointer to char_block
(指向16个字符的数组的指针); *b
的类型为char[16]
。在大多数情况下,使用*b
会将该类型转换为指向数组第一个元素(类型为char*
)的指针。
在一些当前的C实现中,类型char(*)[16]
和char*
的值可以安全地解释为void*
,这是%p
期望的格式说明符的类型的
请注意,char(*)[16]
和char*
对void*
类型值的解释并不能保证标准成功。您应该将值转换为安全
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