题目一
int main() { int a[5] = { 1, 2, 3, 4, 5 }; int *ptr = (int *)(&a + 1); printf( "%d,%d", *(a + 1), *(ptr - 1)); return 0; }
1*(a+1)可以等价于a[1],即第一个打印的是数组第二个下标的元素:2
2 而ptr拿到的是整个数组的地址再加一 所以指向五后面一个元素
而随后又被强转成int类型的指针了 所以移动的范围变成了一个元素
所以说 最后向前移动一位 变成指向元素5
所以说 最终的结果是2 5
运行结果:
题目二
我们首先要明确 0x1是一个十六进制数字1
运行结果:
题目三
int main() { int a[4] = { 1, 2, 3, 4 }; int *ptr1 = (int *)(&a + 1); 首先取地址a是取出整个数组的地址 加上1之后指针指向4 所以说指向4后面一个元素 所以说ptrl{-1}应该是指向4 int *ptr2 = (int *)((int)a + 1); 下面这个我们就要画图来解释了 printf( "%x,%x", ptr1[-1], *ptr2); return 0; }
2.*ptr强制转换成整型 ,a+1即整形加一,内存向后移一位,但又因为是int*类型指针,四个字节计算,所以计算出来为2000000
题目四
int main() { int a[3][2] = { (0, 1), (2, 3), (4, 5) }; int *p; p = a[0]; printf( "%d", p[0]); return 0; }
这个其实是一个逗号表达式 里面真正的内容应该是 1 3 5 0 0 0
输出的结果应该是第一行首元素 应该是1
以上便是本篇所有内容了,如有错误各位大佬不吝赐教,感谢留言