首页 > 解决方案 > 在 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 *是一个派生数据类型,即,这是否反驳了我们对这种情况的假设

标签: cpointerstypesdeclaration

解决方案


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 中通过引用传递意味着通过其派生指针类型的另一个对象间接传递一个对象,该对象引用原始对象的类型。


推荐阅读