c - 在 C 中,'int *' 是派生数据类型吗?
问题描述
是否是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 中通过引用传递意味着通过其派生指针类型的另一个对象间接传递一个对象,该对象引用原始对象的类型。
推荐阅读
- android - 程序类型已经存在:com.google.devtools.build.android.desugar.runtime.ThrowableExtension
- sql-server - 如何在 SQL Server 中存储 unicode 字符?
- javascript - “if”语句中的变量声明
- r - 在列表构建期间评估名称
- jenkins - java.nio.file.NoSuchFileException: /target/classes/META-INF/annotations/hudson.Extension 在构建 Jenkins 插件时
- ms-access - 运行时错误“5”:使用全局变量时
- javascript - PEG.js - 如果表达式不匹配则抛出错误
- ado - 使用 ADOQuery 插入数据库时收到语法错误
- postscript - ps 文件在过程中调用“长度”
- ios - iOS 将 AVI 转换为 MP4