指针练习题3

判断打印结果:

#include <stdio.h>

int main(int argc, char* argv[])
{
	int a[4] = { 1, 2, 3, 4 };
	int* ptr1 = (int*)(&a + 1);
	int* ptr2 = (int*)((int)a + 1);

	printf("%x\n%x\n", ptr1[-1], *ptr2);

	return 0;
}

分析:

1.ptr1[-1]

  • &a + 1为偏移整个数组的长度,即为4*4个字节。
  • ptr[-1] = *(ptr – 1)

2.*ptr2

  • (int)a强制类型转换为整形(非指针)

  • (int*)((int)a + 1)相当于从左数第二个字节的起始地址开始向后读一个int的长度。即,0002。
  • %x转换为16进制输出为0x2000000。

结果:

 

以上三题出自https://blog.csdn.net/Zhang_1218/article/details/76598525