灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:10259回复:1

一道C语言的指针笔试题

楼主#
更多 发布于:2014-04-03 10:34
题目如下:
 
?
1
2
3
4
5
6
7
8
9
10
11
12
#include<stdio.h>
int main()
{
char *a="Aliyun";
char **b=&a;
*b="programming test";
char *c=++a;
a="talents.";
printf("%cn",*++c);
return 0;
}
</stdio.h>

问输出是什么。
 
我们一步步分析。
首先是第一句: char *a="Aliyun";,这句程序就是声明了一个指针变量a,a指向常量字符串"Aliyun"。也就是说,变量a里面存放的所地址,也就是存放字符串"Aliyun"的地址。
第二句:char **b=&a;这句就是声明了一个指针的指针,其实实际上b还是一个指针,只不过b指向的变量是一个指针。也就是说,b里存放着a的地址,注意是a的地址,而不是a的值。这里我们要明白一个概念,指针型的变量存放的永远都是地址,当然不包括NULL。
第三句:*b="programming test";这里的*被称作解引用符,简单点来说,就是取指针b指向的内容。这里*b=a;所以*b实际上是a。
也就是说这句话等于a="programming test";意思就是指针a指向了新的字符串"programming test”。注意一下,当一个指针直接=字符串的时候,是将该字符串的地址赋给这个指针。所以如果int *a=12;这句话就出错了,这个意思就是直接把12赋给指针a,因为类型不同,所以会提示出错,当然,还是可以把12强制转换成为指针类型的值,然后再赋给变量。
第三句:char *c=++a;这里的a的值实际上是一个地址,指向的是字符串"programming test”的首个字符,也就是"p",++a是先自增的。所以c实际上就指向了“r“.
第四句是干扰,c和a没关系。
第五句:*++c。也就是返回一个自增后的地址,然后再取一个字符输出。原来指向的所"r",自增后就是"o"。
所以输出的是字符"o".

 
在ubuntu下用gcc验证成功。

喜欢0 评分0
灯火_001
新手上路
新手上路
  • 注册日期2018-10-16
  • 发帖数12
  • QQ285634299
  • 火币13枚
  • 粉丝0
  • 关注0
沙发#
发布于:2018-10-16 16:29
学习了

回复(0) 喜欢(0)     评分
游客

返回顶部