一.%p和%d打印的结果会是零吗?
#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]);
return 0;
答案当然不会了,让我们一起分析一下这题。
1.%p打印的是地址
2.指针 —— 指针 = 指针之间的元素个数
3.对于这道题我们可以画图看看,因为数组之间是连续存放的,而数组名a是数组首元素地址,所以由图不难得出结果。
二.那这一题结果又是多少呢
#include <stdio.h>
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;
}
1.看*ptr1和*ptr2的区别:一个是&aa+1,另一个是*(aa+1)。(图中少写一个a)
注意;(1)&(取地址操作符)+ 数组名 =整个数组的地址,+1表示跳出这个数组,如图表示
所以*(ptr1-1)的位置如图
(2):aa是二维数组名,&aa代表首行地址,*(ptr2-1)==&aa
三.最后一个,很有意思滴,看代码
不难哈,还是像上面一样画图分析。%s是打印字符串
#include <stdio.h>
int main()
{
char *c[] = {"ENTER","NEW","POINT","FIRST"};
char**cp[] = {c+3,c+2,c+1,c};
char***cpp = cp;
printf("%s\n", **++cpp);
printf("%s\n", *--*++cpp+3);
printf("%s\n", *cpp[-2]+3);
printf("%s\n", cpp[-1][-1]+1;
return 0;
}
1.先画图表示*c,**cp,***cpp之间的关系
(1)**++cpp:++和**的优先级相同,先算++cpp得到c+2,在解引用得到“POINT”。注意++cpp改变了cpp的位置。
(2)*--*++cpp+3:还是从优先级考虑,--和*,++相同,-最低,先算++cpp,然后解引用,得到c+1,我们拿到的是cp里面的内容,然后--得到的是c,在解引用得到的是“ENTER”,+3是跳过三个字符,最后ER。
(3)*cpp[-2]+3:*cpp[-2]==*(*(cpp-2)),在前两个中通过++改变了cpp指向cp的位置,所以*(cpp-2),得到的是c+3,在解引用得到的是*c中的“FIRST”,加3得到ST。
(4)cpp[-1][-1]+3:还是同样的分析不过要注意在(3)中cpp并未改变,没有操作符(如++)改变cpp指向cp的位置。cpp[-1]==*(cpp-1),cpp[-1][-1]==*(*(cpp-1)-1),cpp本指向c+1的内容,cpp[-1]指向c+2,-1变成c+1,解引用指向“NEW”,+1,指向“EW”
总结:有些题并不是像我们想象中的那么难,有时候我也会被一道题气的非常恼火,一写三个小时都没有头绪,很痛苦,但是第二天依旧想,看别人的解题思路,总而言之坚持!既然选择了就全力以赴!!!