给出一个表示以下点的结构:
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];
答案 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]
时,您不能在结构定义结束时执行此操作。它会将其视为创建一种内联类型的结构定义的类型。