【问题标题】:In C, is 'int *' a derived datatype?在 C 中,'int *' 是派生数据类型吗?
【发布时间】:2021-10-30 09:19:51
【问题描述】:

int * 是不是派生数据类型?

我感到困惑是因为我觉得这两个案例在这个问题上是矛盾的。


案例 1: 假设: int * 被视为派生数据类型。然后考虑下面给出的代码 -

void someRandomFunction()
{
    int* a, b, c, d;
    int  e, f, g, h;
    ....
    ....
    ....
}

在这个函数中,如果我们需要将int *视为派生数据类型,那么就像e, f, g, hint数据类型的变量一样,所有变量a, b, c, d必须是指向int数据类型的指针,对吧?

但由于只有a 是指向int 数据类型的指针,那么这是否反驳了我们对这种情况的假设


案例 2: 假设:int *被视为派生数据类型。然后考虑下面给出的代码 -

int* MyFunc()
{
    int *p;
    ....
    ....
    ....
    return p;
}

这里,int * 正在向编译器指示return's datatype,对吧?那么,这是否证明int * 是派生数据类型,即,这是否反驳了我们对这种情况的假设

【问题讨论】:

  • 派生数据类型是什么意思?
  • b,c,d,e,f,g,h 不是指向 int 的指针。例如,标识符“b”是对 int 变量地址的直接转换。而标识符“a”是对地址的直接转换,该地址将地址保存到 int 变量。细微的差别。
  • b 的任何属性都不意味着int* 是否是派生数据类型(无论您是什么意思),因为b 根本不是int 类型。你不能从不是 X 的对象中扣除关于 X 的任何属性。
  • 我很难理解你的推理方式。当您推断“是的,它是派生数据类型”时,我几乎一直与您同在,但最后您失去了我。
  • 这能回答你的问题吗? C and derived data types?

标签: c pointers types declaration


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    好的。 我们有一个基本的数据类型(int、float、double、...),我们有一个派生的 数据类型,我们也有一个派生的数据类型(基本数据类型有一些 扩展名)。

    在您的第一个示例int* a, b, c, d; 中,我们有一个a 作为指向整数的指针 但是b, c, d 不是指向整数的指针,因为它们只是整数

    所以,是的,你是对的! int* 是从 int 派生的。 您的困惑始于将b,c,d 也作为指针,但事实并非如此。 在C编程语言中变量声明过程中如果有* 在变量名和她的数据类型之间,该变量是指向她的指针 数据类型。

    【讨论】:

      【解决方案3】:

      派生数据类型是从基本数据类型派生的数据类型。在这种情况下,int * 是从int 派生的数据类型。

      您的第一个分析不正确。让b, c, d 拥有int 数据类型并不是说int * 不是派生数据类型。所以这只是关于 C 是如何工作的。这就是为什么编写这样的声明总是一个好主意:int *a, .... 所以* 与变量相邻,而不是表示任何即将到来的变量不采用 * 而只是数据类型的类型。

      就像数组一样。

      int a[10], b;
      

      这里的数组是派生数据类型,但 b 的类型为 int 并不表示该数组不是派生数据类型。

      【讨论】:

        【解决方案4】:

        数组、结构、联合、函数、指针和原子类型都派生自其他类型。

        int* a, b; 不是一种表示b 是指针类型的方式。声明的语法是*a 绑定;声明实际上是int *a, b;,好像是int *a; int b;

        在 C 中,声明使用基本类型,如 int,然后使用 a “picture” of how the type will be used 描述派生类型。在int *a; 中,我们说*a 将用作int。由此推断a一定是指向int的指针。同样,int *a[3] 表示*a[i] 将用作int,因此a[i] 必须是指向int 的指针,因此a 必须是指向int 的指针数组。

        然后int *a, b;*aintbint

        【讨论】:

          猜你喜欢
          • 2011-08-26
          • 1970-01-01
          • 2012-02-11
          • 2011-08-18
          • 2013-08-31
          • 1970-01-01
          • 2023-04-11
          • 2018-05-27
          相关资源
          最近更新 更多