执行typedef

时间:2016-07-11 14:50:55

标签: c arrays initialization structure typedef

给出一个表示以下点的结构:

typedef struct p
{
    char c;
    float x,y;
}P[2];

如何定义和初始化一个代表点A(1,0)B(3,0)的行的数组?

在以下代码中,它显示typedef 'P' is initialized (use typeof instead)

#include<stdio.h>
typedef struct p
{
    char c;
    float x,y;
}P[2]={{'A',1.0,2.0},{'B',3.0,4.0}};
int main()

{
    printf("\n %c %f %f",P[0].c,P[0].x,P[0].y);
    printf("\n %c %f %f",P[1].c,P[1].x,P[1].y);
    return 0;
}

以下工作,但它改变了结构的定义:

#include<stdio.h>
typedef struct p
{
    char c;
    float x,y;
}point;
point P[2]={{'A',1.0,2.0},{'B',3.0,4.0}};
int main()

{
    printf("\n %c %f %f",P[0].c,P[0].x,P[0].y);
    printf("\n %c %f %f",P[1].c,P[1].x,P[1].y);
    return 0;
}

如何在不更改结构定义的情况下初始化此数组:

 typedef struct p
{
    char c;
    float x,y;
}P[2]; 

3 个答案:

答案 0 :(得分:3)

你在这里

#include <stdio.h>

typedef struct p
{
    char c;
    float x,y;
}P[2];

int main( void ) 
{
    P a = { { 'A', 1.0f, 2.0f }, { 'B', 3.0f, 4.0f } };

    printf( "a[0] = { %c, %f, %f }, a[1] = { %c, %f, %f }\n", 
            a[0].c, a[0].x, a[0].y, a[1].c, a[1].x, a[1].y );

    return 0;
}

程序输出

a[0] = { A, 1.000000, 2.000000 }, a[1] = { B, 3.000000, 4.000000 }

考虑到typedef没有定义对象。它定义了类型的别名。

在显示的程序中,typedef将名称P定义为类型struct p[2]的别名。

所以不要写例如

struct p a[2];

你可以写

P a;

答案 1 :(得分:2)

根据C11,章节§6.7.8/ p3,类型定义,(强调我的

  

在存储类说明符为typedef的声明中,每个声明符定义一个   标识符是typedef名称,表示为标识符指定的类型 [...]

所以,如果你写得像

typedef struct p
{
    char c;
    float x,y;
} X;

X不是可以初始化的变量,它是类型。您需要定义该类型的变量,例如

X y[2] = {0};

在您的情况下,如果您确实希望类型P[2],您也可以这样做,例如

typedef struct p
{
    char c;
    float x,y;
}P[2]; 

然后,

P var = {....//initializer list, }

并且是的,将这两者合并为一个语句并不容易。

答案 2 :(得分:0)

typedef不是结构定义的必要部分,事实上,如果程序中只需要一个变量,则不需要提供结构名称。您的案例中的简单定义是

    struct {
        char c;
        float x,y;
    };

如果你想在整个文件中初始化该类型的一个变量,那么你可以给出这样的东西

    struct {
        char c;
        float x,y;
    } point = {'A', 1.0, 2.0};

如果要初始化该结构的数组,则可以将point更改为

    point[2] = {{'A', 1.0, 2.0}, {'B', 3.0, 4.0}}

现在您想将结构命名为p,然后您的结构将是

    struct p {
        char c;
        float x,y;
    } point[2] = {{'A', 1.0, 2.0}, {'B', 3.0, 4.0}};

此处point将是struct p类型的变量,并且是array,大小为2

现在,当您向typedef添加struct时,它会在最后开始考虑您没有声明类型为struct p的变量,而是为与{相关的内容提供别名{1}}。它可以是struct p的指针类型,或者在您的情况下它是一个数组。例如,如果我想创建struct p的{​​{1}},那么我会写

typedef

所以我可以将struct p*类型的变量声明为 typedef struct p { char c; float x,y; } *point;

在您的示例中,您已将结构赋予

struct p*

现在您可以将point P类型的变量声明为 typedef struct p { char c; float x,y; } point[2];

对于初始化,当您实际在开始时给出struct p[2]时,您不能在结构定义结束时执行此操作。它会将其视为创建一种内联类型的结构定义的类型。