[英]In C, is 'int *' a derived datatype?
int *
是否是派生数据类型?
我感到困惑是因为我觉得这两个案例在这个问题上是矛盾的。
情况 1:假设: int *
被视为派生数据类型。 然后考虑下面给出的代码 -
void someRandomFunction()
{
int* a, b, c, d;
int e, f, g, h;
....
....
....
}
在这个函数中,如果我们需要将int *
视为一个派生数据类型,那么就像e, f, g, h
都是int
数据类型的变量一样,所有的变量a, b, c, d
必须是指向int
数据类型的指针,对?
但是因为它只是a
指向int
数据类型的指针,所以这是否反驳了我们对这种情况的假设?
情况 2:假设: int *
不被视为派生数据类型。 然后考虑下面给出的代码 -
int* MyFunc()
{
int *p;
....
....
....
return p;
}
这里, int *
正在向编译器指示return's datatype
,对吗? 那么,这是否证明int *
是派生数据类型,即这是否反驳了我们对这种情况的假设?
int * 是否是派生数据类型?
它是从对象类型int
派生的类型。
如果我们需要将int *视为派生数据类型,那么就像e,f,g,h是int数据类型的变量一样,所有变量a,b,c,d都必须是指向int数据类型的指针,对吗?
如果您将类型int *
作为类型说明符引入,例如
typedef int * T;
那么确实在这个声明中
T a, b, c, d;
所有声明的变量都具有int *
类型。 否则符号*
与此声明中变量a
的声明符相关
int* a, b, c, d;
可以重写为
int ( * a ), b, c, d;
注意声明是这样定义的(这里是声明的部分定义):
declaration:
declaration-specifiers init-declarator-listopt ;
declaration-specifiers:
type-qualifier declaration-specifiersopt
init-declarator-list:
init-declarator
init-declarator-list , init-declarator
init-declarator:
declarator
declarator = initializer
那是在这个声明中
int* a, b, c, d;
所有声明符的公共类型说明符是int
,声明符a
的形式为*a
。
虽然在本声明中
T a, b, c, d;
公共类型说明符是T
表示派生指针类型int *
。
即派生指针类型 int * 是从其引用类型int
构建的。 派生类型int **
是从其引用类型int *
构建的,依此类推。
因此,例如在 C 中按引用传递意味着通过引用原始对象类型的派生指针类型的另一个对象间接传递一个对象。
好的。 我们有一个基本数据类型(int、float、double...),我们有一个派生的数据类型,我们还有一个派生的数据类型(带有一些扩展的基本数据类型)。
在你的第一个例子中int* a, b, c, d;
我们有一个a
作为指向整数的指针,但b, c, d
不是指向整数的指针,因为它们只是整数!
所以,是的,你是对的! int*
派生自 int。 您的困惑始于将b,c,d
也作为指针,但事实并非如此。 在 C 编程语言中,在变量声明过程中,如果变量名和她的数据类型之间有一个*
,那么该变量就是指向她的数据类型的指针。
派生数据类型是从基本数据类型派生的数据类型。 在这种情况下, int *
是从int
派生的数据类型。
你的第一个分析是不正确的。 使b, c, d
具有int
数据类型并不表示int *
不是派生数据类型。 所以这只是关于 C 是如何工作的。 这就是为什么写这样的声明总是一个好主意: int *a, ....
所以*
与变量相邻,而不是表示任何即将到来的变量不采用*
而仅采用数据类型的类型.
就像数组一样。
int a[10], b;
这里的数组是派生的数据类型,但b
类型为int
并不表示该数组不是派生的数据类型。
数组、结构、联合、函数、指针和原子类型是从其他类型派生的。
int* a, b;
不是表示b
是指针类型的一种方式。 声明的语法是这样的: *
绑定与a
; 声明实际上是int *a, b;
, 好像是int *a; int b;
int *a; int b;
.
在 C 中,声明使用基本类型,如int
,然后通过使用类型将如何使用的“图片”来描述派生类型。 在int *a;
,我们是说*a
将用作int
。 由此推导出a
必须是指向int
的指针。 类似地, int *a[3]
表示*a[i]
将用作int
,因此a[i]
必须是指向int
的指针,因此a
必须是指向int
的指针数组。
然后int *a, b;
说*a
是一个int
而b
是一个int
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.