C语言———指针运算笔试题部分解析

一.%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”


总结:有些题并不是像我们想象中的那么难,有时候我也会被一道题气的非常恼火,一写三个小时都没有头绪,很痛苦,但是第二天依旧想,看别人的解题思路,总而言之坚持!既然选择了就全力以赴!!!

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值