笔试题1:
int main()
{
int a[5] = { 1, 2, 3, 4, 5 };
int *ptr = (int *)(&a + 1);
printf( "%d,%d", *(a + 1), *(ptr - 1));
return 0;
}
//程序的结果是什么?
对于第一个结果, *(a+1), 此时数组名表示首元素地址, 类型为int*, +1即是往后移动四个字节, 跳跃到&a[1], 相当于&a[1], 解引用就是a[1] = 2;
对于第二个, *(ptr - 1), 先看ptr, 先对a取地址, 取出的是整个数组的地址, +1, 就是往后走5*sizeof(int)个字节, 指向a[4] = 5后面四个字节处的地址.即ptr = &a[4] +1
再将其强制类型转换为(int *)类型, 跟ptr是同一类型,
于是*(ptr - 1), 就是 = *(&a[4] +1-1) = *(&a[4]) = a[4] = 5
最后的输出结果
2,5Program ended with exit code: 0
笔试题2
//由于还没学习结构体,这里告知结构体的大小是20个字节
struct Test
{
int Num;
char *pcName;
short sDate;
char cha[2];
short sBa[4];
}*p;
//假设p 的值为0x100000。 如下表表达式的值分别为多少?
//已知,结构体Test类型的变量大小是20个字节
int main(int argc, const char * argv[]) {
printf("%p\n", p + 0x1);
printf("%p\n", (unsigned long)p + 0x1);
printf("%p\n", (unsigned int*)p + 0x1);
return 0;
return 0;
}
注: %p是十六进制打印地址
第一个, p + 0x1, 这里定义了一个结构体类型的指针 p, 0x是16进制 , 假设p 的值为0x100000, 且结构体的大小是20个字节, 那么往后移动20字节, 16进制的20是 14, 0x100014
第二个, (unsigned long)p + 0x1, 先将p转为(unsigned long)类型,也就是无符号整数, 再加一, 那么p+0x1 = 0x100000 + 0x000001 = 0x100001,
第三个,移动 1*4个字节, 那么就是输出0x000 004 + 0x100 000 = 0x100 004
0x100020
0x100001
0x100004
笔试题3
int a[4] = { 1, 2, 3, 4 };
int *ptr1 = (int *)(&a + 1);
int *ptr2 = (int *)((int)a + 1);
printf( "%x,%x", ptr1[-1], *ptr2);
ptr1[-1] == *(ptr1-1) = a[3] = 4,
就先编辑到这里 最近有事就不能更了