第五题:
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]);
return 0;
}
a[5][5]为一个二维数组
int(*p)[4]为一个数组指针,指向四个元素的数组
p[4] 就是 *(p + 4) 嘛, 因此就是得到一个数组
&p[4][2] - &a[4][2],即取首地址相减,为指针-指针,指针-指针的含义是相差了几个相同元素
这里是相差了4个相同元素,结果为-4,-4的16进制表达式//FF FF FF FC
第六题
int main()
{
int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int *ptr1 = (int *)(&aa + 1);
int *ptr2 = (int *)(*(aa + 1));
printf( "%d,%d", *(ptr1 - 1), *(ptr2 - 1));
return 0;
}
int *ptr1 = (int *)(&aa + 1);
&aa+1为跳过了整个数组,指向数组外,并转成int*类型传到了ptr1中
*(ptr1 - 1)的值为10
int *ptr2 = (int *)(*(aa + 1));
*(aa+1)=>arr[1],取到第二行的首元素地址(6的)
*(ptr2 - 1),再将他减去一个整型元素,得到5
第七题:
#include <stdio.h>
int main()
{
char *a[] = {"work","at","alibaba"};
char**pa = a;
pa++;
printf("%s\n", *pa);
printf("%s\n", *pa+1);
return 0;
}
char *a[] = {“work”,“at”,“alibaba”};
是一个指针数组,保存着每个字符串的地址
char**pa = a; //pa保存着这个数组a的首元素地址
pa++;指针加一,跳过一个元素,指向0x200,保存0x200的首元素地址
进行解引用