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。 从这里也可以看出,->主要用于指针取值,.用于非指针取值 }