一道C语言的指针笔试题

题目如下:

#include<stdio.h>
int main()
{
	char *a="Aliyun";
	char **b=&a;
	*b="programming test";
	char *c=++a;
	a="talents.";
	printf("%c\n",*++c);
	return 0;
}

问输出是什么。

我们一步步分析。

首先是第一句: 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验证成功。

一道C语言的指针笔试题,布布扣,bubuko.com

一道C语言的指针笔试题

上一篇:【Spring MVC】教程——使用拦截器实现权限控制


下一篇:Java基础面试题3(排序算法)