复合类型的声明——是int *p还是int* p

Posted GGBeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了复合类型的声明——是int *p还是int* p相关的知识,希望对你有一定的参考价值。

我们先来看一条基本类型的声明语句:int a, b, ... 

即一条声明语句由一个数据类型(int)和紧随其后的一个变量名列表(a, b, ...)组成

更通用的描述是:一个基本数据类型和紧随其后的一个声明符列表组成,每个声明符命名了一个变量并指定该变量是与该基本数据类型有关的某种类型。

例如:上面的声明语句中,声明符其实就是变量名,变量的类型也就是声明的基本数据类型。这只说明这个声明符是简单的,我们下面介绍更复杂的声明符,它基于基本数据类型得到更复杂的类型(如指针、引用等),并把它指定给变量。

 

我们来看这么一条定义语句:int i = 10, *p = &i, &r = i;

上面这条定义语句中包含类型修饰符“*”、“&”,我们往往迷惑于基本数据类型和类型修饰符的关系,但必须要知道的是类型修饰符只是声明符的一部分罢了。

 

再来看这么一条声明语句:int *p1, *p2;

我们往往称“*”为类型修饰符,而将“p1”称为变量标识符声明符就是类型修饰符和变量标识符的组合“*p1”。

这种形式着重强调变量具有复合类型

 

还有一种声明的方法:int* p1, p2;

我们本打算定义两个指针变量p1和p2,但结果却是只定义了一个指针变量p1,变量p2则是int型变量。

之所以会产生这样的错误,是因为我们误以为类型修饰符“*”作用于本次定义的全部变量,int*放在一起好像是这条声明语句中所有变量共同的类型一样。其实,基本数据类型是int而非int*,“*”仅仅是修饰了p1而已,对该声明语句中的其他变量并不产生任何作用。

 

如果我们硬是要让基本数据类型和类型修饰符放在一起,可以每条声明语句只定义一个变量:

	int* p1;
	int* p2;

这种形式着重强调本次声明定义了一种复合类型

 

【补充】

这样的声明语句等价于上面的声明语句:int* p1, *p2;        //不觉得难看??

结论:题目中的两种方法都可以,但推荐使用声明符的方法!

 

 

以上是关于复合类型的声明——是int *p还是int* p的主要内容,如果未能解决你的问题,请参考以下文章

GO语言复合类型01---指针

go 复合类型: 数组slicemap结构体

int fun(int x){int p;if(x == 0 || x==1) return p=3;else p = x-fun(x-2);}void main(){printf(“%d “)}(代

指针学习

函数指针

go语言学习四 - 复合类型字面量声明