第1题
#include<stdio.h>
int main()
{
int a[4] = {1,2,3,4};
int *ptr=(int*)(&a + 1);//4
int *ptr2=(int*)((int)a + 1);//2000000
printf("%x,%x",ptr[-1],*ptr2);//%x 16进制的形式输出整数
//&a+1跳过整个数组 ptr[-1] 向前移动4个字节 所以是4
//(int)a+1 把a强制转换成整数再+1 这个时候就是实实在在的+1个字节
//*ptr2 解引用 向后访问1个字节00 00 00 02 因为是小端存储模式
//所以结果为 2000000
return 0;
}
运行结果:
第2题
#include<stdio.h>
int main()
{
int a[3][2] = {(0,1),(2,3),(4,5) };
int *p;
p = a[0];
printf("%d\n",p[0]);//1
//逗号表达式 内存里面 1 3 5 0 0 0 a[0] a是数组名 数组名表示首元素地址
//所以是第一行第一个元素,p[0]相当于*(p+0) 所以也是第一行第一个元素
return 0;
}
运行结果:
第3题
#include<stdio.h>
int main()
{
int a[5][5];
int(*p)[4];
p = a;
printf("%p,%d\n",&p[4][2] - &a[4][2],&p[4][2] - &a[4][2]);
//p[4][2] == *(*(p+4)+2)
//两个指针相减等于两个指针之间的元素个数,如果a-b b>a 那么这个元素之间的个数就是负数
return 0;
}
//-4
//10000000000000000000000000000100 - 原码
//11111111111111111111111111111011 - 反码
//11111111111111111111111111111100 - 补码
//1111 1111 1111 1111 1111 1111 1111 1100
// F F F F F F F C
内存分布图:
运行结果: