第一题:
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,2,3,4,5.
2.将a的地址取出来+1跳过整个数组,再强转成 int*为首元素的地址
3.所以*(a+1)a的地址是首元素的地址+1为第二个元素的地址
4.(*ptr-1)是存放下一个数组的首地址-1便得到了这个数组最后一个元素的地址
所以最后的结果为2 5.
第二题:
struct Test
{
int Num;
char *pcName;
short sDate;
char cha[2];
short sBa[4];
}*p;
//假设p 的值为0x100000。 如下表表达式的值分别为多少?
//已知,结构体Test类型的变量大小是20个字节
int main()
{
p=(struct Test *)0x100000;
printf("%p\n", p + 0x1);
printf("%p\n", (unsigned long)p + 0x1);
printf("%p\n", (unsigned int*)p + 0x1);
return 0;
}
解析:
1.*p为结构体的指针变量
2.p是指向结构体+1跳过20个字节,0x100014(注意十六进制的转化)