c - sizeof() 运算符和指针声明中的问题
问题描述
这个问题是在我的 Sem-2 考试中提出的。问题要求我们提供所需的输出。
int main(void)
{
int a[] = {10,20,30,40,50,60};
int (*p1)[2]=a , (*p2)[3]= a;
if(sizeof(p1)==sizeof(p2))
printf("%d",*(*p1+2));
if(sizeof(*p1)==sizeof(*p2))
printf("%d",*(*(p2+1)));
return(0);
}
编译器警告:
Warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
initialization from incompatible pointer type [-Wincompatible-pointer-types]
我期望的输出:20
运行时得到的输出:30
使用:gcc (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0
解决方案
让我们忽略未定义的行为以找出可能发生的情况。
p1
并且p2
都指向a[0]
(忽略不兼容的指针类型)。
p1
并且p2
都是指针。指向对象类型的指针通常大小相同(假设是这种情况),因此sizeof(p1)==sizeof(p2)
也是如此。
p1
是类型的int (*)[2]
,所以*p1
也是类型的int[2]
。在大多数表达式中,数组将衰减为指向其第一个元素的指针,因此在表达式*(*p1+2)
中,*p1
将衰减为 anint *
并将指向a[0]
。因此*p1+2
将指向a[2]
。因此*(*p1+2)
将与 相同a[2]
,具有价值30
。因此程序打印30
。
当数组是运算符的操作数时,数组不会衰减为指针sizeof
。*p1
is of type int[2]
and *p2
is of type int[3]
,所以sizeof(*p1)==sizeof(*p2)
等价于sizeof(int[2])==sizeof(int[3])
,这是假的。因此,不会评估printf
打印值的第二个调用。*(*p2+1)
(假设第二个printf
被调用并被*(*p2+1)
评估。*p2
是类型int[3]
,在这个表达式中它衰减到int *
指向a[0]
。因此*p2+1
指向a[1]
。因此,*(*p2+1)
将与a[1],
具有值的相同20
。)
推荐阅读
- python - 命令不能与 subprocess.run 一起使用,但可以与 subprocess.call 一起使用
- css - css dotted hr 是一组小正方形而不是点/cricles
- pandas - 根据 pandas 中给定的特定条件从给定日期创建 year_category
- html - VBA在网页上的特定搜索框中输入值
- python - 如何突出显示字符串中的单词 [Python]
- c++ - 最让人头疼的解析更让人头疼
- flutter - Flutter (_TypeError) 不明白为什么会发生这种情况
- python - Pandas 按列函数拆分 DataFrame 并分组
- google-cloud-dataflow - BigtableToAvro 始终挂起:ping 错误 Deadline 已超过
- angular - 延迟加载的脚本路径在生产构建中无法正常工作