C语言typedef struct XXX与struct XXX的区别

1.结构体究竟怎么定义


在C语言中,定义一个结构体使用的是struct关键字。一般有以下两种:

1. 定义结构体的时候,struct_id(结构体标识名)可省略。后面直接跟这个结构体类型变量
struct {
    成员变量类型 成员变量名称;
} str1, str2;
上述代码定义了一个结构体,申明了str1, str2两个结构体变量

2. 定义结构体的时候,不省略struct_id(结构体标识名),后面可跟可不跟结构体变量
struct student {
    成员变量类型 成员变量名称;
} var1(可省略);
struct student stu1, stu2;  // 声明两个结构体变量stu1, stu2。若var1未省略,那么var1也是一个结构体变量

3. 在函数外使用typedef定义结构体。首先我们该明白typedef是什么。C语言中typedef是一个数据类型修改器,
typedef char CHAR  // 在后续声明变量的类型时,CHAR可以直接代替掉char。如char a;等价于CHAR a;
typedef int INtEGER  // 在后续声明变量的类型时,CHAR可以直接代替掉int。如int b;等价于INTEGER b;

所以:
typedef struct student{
    char* name;
    int age;
} STUDENT;  // 这个表示定义了一个结构体,结构体的标识是student,所以正常我们申明这个结构体变量应该是struct student stu1;但是我们使用了typedef关键字,现在可以直接使用STUDENT stu2;来声明一个结构体变量

2. 结构体怎么初始化


结构体初始化可以在声明变量的时候使用{value1, value2, ...}来初始化,如下
struct student {
char* name;
int age;
} stu1 = {"fane", 22};

也可以使用下面的方式初始化:
struct student {
char* name;
int age;
};
struct student stu2;
stu2.name = "fane";
stu2.age = 22;
// 需要说明的是,不管是Java还是C,只有在一个变量申明的时候可以使用{value1, value2,...}去对一个变量初始化,变量声明结束后,不可以再使用{value1, value2,...}去初始化一个变量。


ps:

void mian (){
     C语言中.和->的区别。当我们使用一个非指针的变量去访问成员变量的时候使用objName.fieldName。
     使用一个指针类型的变量访问是(*p).fieldName。注意.运算优先级高于*。所以*p.fieldName执行会出错,
     除非p指针确实有个成员变量。每当我们使用一个指针类型的变量访问成员变量需要加()限制运算优先级。
     大神们觉得每次写特别麻烦,就发明了->运算符。p->fieldName等价于(*p).fieldName。
     从这里也可以看出,->主要用于指针取值,.用于非指针取值
}
全部评论

相关推荐

05-20 21:57
已编辑
门头沟学院 Java
喜欢吃卤蛋的悲伤蛙在提需求:建信融通没消息吧,我2说有实习挂简历不理了
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务