天天看點

一道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驗證成功。