【问题标题】:typedef struct as pointer?typedef 结构作为指针?
【发布时间】:2018-10-24 13:14:03
【问题描述】:

我有一个关于 typedef struct 的问题,我相信我知道答案,但希望得到澄清。

假设我有:

typedef struct Scanner{
    //information
}myScanner;

这是否与以下具有相同的含义:

typedef struct Scanner *myScanner; 
struct Scanner {
    //information
};

【问题讨论】:

标签: c struct


【解决方案1】:

如果您对两个typedef 定义使用相同的格式,很容易看出区别:

typedef struct Scanner myScanner;

typedef struct Scanner *myScanner;

使用typedef 定义类型别名非常类似于声明变量。对于typedef,星号表示“定义为指针”,就像它对变量所做的那样。

【讨论】:

    【解决方案2】:

    类型定义通常在没有创建变量的头文件中。 在你的 main() 中,你应该使用这种类型来创建变量。在我们的示例中,新生成的类型是“扫描仪”。


    #include <stdio.h>
    #include <stdlib.h>
    
    struct _scanner
    {       // example
        int a;
        double b;
        char c;
    };
    typedef struct _scanner Scanner;
    
    
    int main()
    {
        Scanner s;
        s.a = 10;
        s.b = 3.14;
        s.c = 'N';
        // -------------------
        // If you want to have a
        //  pointer p to scanner, then
    
        Scanner* p = &s;
    
        p->a = 20;
        p->b = 2.72;
        p->c = 'Y';
    
        printf("%d, %.2lf, %c\n",
               s.a, s.b, s.c);
    
        return EXIT_SUCCESS;
    }
    

    输出:

    20, 2.72, 是

    创建变量后,您可以创建指向它的指针,因为指针必须能够指向某物。输出显示值已被成功操作。

    【讨论】:

    • 请注意,一般情况下,您不应创建以下划线开头的函数、变量、标记或宏名称。 C11 §7.1.3 Reserved identifiers 的一部分说: — 以下划线开头的所有标识符以及大写字母或另一个下划线始终保留用于任何用途。所有以下划线开头的标识符始终保留保留用作普通和标记名称空间中具有文件范围的标识符。 另见What does double underscore (__const) mean in C?
    【解决方案3】:

    typedef struct Scanner *myScanner;——在这里你声明了指向struct Scanner的类型指针。

    typedef struct Scanner myScanner; — 是一种新类型的声明。

    这意味着,在第一种情况下,您定义了一个指向struct Scanner 的指针,用于算术计算等,指向的元素类型。 myScanner 的大小将等于 void* 的大小(操作系统上的指针大小)。

    对于第二种情况,您正在定义一种新类型的元素;它的大小是
    sizeof(struct Scanner) == size of(myScanner)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-24
      • 1970-01-01
      相关资源
      最近更新 更多