C语言中关于二级指针的笔试题

 C语言中关于二级指针的笔试题

int main(){	
	char* str[] = { "welcome","to","Fortemedia","Nanjing" };
	char** p = str + 1;
	str[0] = (*p++) + 2;
	str[1] = *(p + 1);
	str[2] = p[1] + 3;
	str[3] = p[0] + (str[2] - str[1]);
	printf("%s\n", str[0]);//\n
	printf("%s\n", str[1]);//Nanjing
	printf("%s\n", str[2]);//jing
	printf("%s\n", str[3]);//g
	return 0;
}

看到这段代码 ,我们不仔细思考, 很可能得出错误的结果 , 

比如得到 
(空)
Nanjing
jing
temedia

不过 , 我们认真分析的话 , 得出正确答案也并不困难 . 

char* str[] = { "welcome","to","Fortemedia","Nanjing" };
char** p = str + 1;

运行这两段代码后会得到如图所示 : 


画出(*p++) + 2

 

 

 

str[0] = (*p++) + 2;

再将(*p++) + 2的值赋给str[0] , 此时str[0]指向就如下图 :

再画出*(p + 1)

 

str[1] = *(p + 1);

再将*(p + 1)的值赋给str[1] , 此时str[1]指向向就如下图 : 

再画出p[1] + 3

 

str[2] = p[1] + 3;

然后再将p[1]+3的值赋给str[2] ,如下图:

再画出 p[0] + (str[2] - str[1])

 

 

str[3] = p[0] + (str[2] - str[1]);

我们可以得到str[2] -str[1] = 3 , 在两个指针指向同一片连续的存储空间时 , 是可以相减的 , 相减为两指针间差了几个元素 ,很明显差了三个 , 再将p[0]+str[2] -str[1]的值赋给str[3] ,如下图 :

所以依次输出str[0], str[1], str[2], str[3] 应该得到

(空)
Nanjing
jing
g

我们运行这段代码 ,得到下图 

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值