题目如下:
#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验证成功。