今天我们一起来认识一下C语言中的另外一个核心内容:结构体及结构体指针,咋一听是不是觉得有点独特?因为C语言是面向过程的语言,不像C++ ,Java等是面试对象的,所以结构体就有点类似于class类一样的。下面进入正题:
系统源码中大部分是typedef 开始定义的结构体,这样写是为了代码统一,所以我们下面都按照系统源码的风格来写,至于其他的写法,就看各位看官的喜好了.
开胃菜:枚举:(使用关键字 enum)
说明:
1) 定义的格式
**typedef enum {** **枚举值1 ,** **枚举值2,** **...** **} 枚举名;**
2) 枚举的值都是int类型的。
**如果没有赋值,则默认是从0 开始,依次+1 ;** **如果全部赋值,则使用设置的值;** **如果是部分赋值,则未赋值的枚举则会根据最近的上面的一个枚举值进行+1来赋值;** **简单理解:赋值了用赋的值,未赋值的依次+1**
//自定义枚举
typedef enum {
t=10,
t1=20,
t2,
t3=40,
}CustomEnum;
int main(){
CustomEnum d=t3;
printf("t3= %d\n",d);
return 0;
}
输出结果:40
重头戏:结构体及其指针
说明:
1)需要使用关键字 struct 来声明结构体变量,通过 点运算符来操作结构体成员;
2)可以在声明结构体时,直接声明变量并给变量赋值;
3)结构体嵌套使用;
**3.1)在对嵌套的结构体进行初始化,使用花括号{}来对内部嵌套的结构体进行分割并初始化** **3.2)调用结构体内部嵌套的结构体时,可以直接使用点运算符来操作内部结构体变量**
4)结构体指针使用->访问成员;
5)使用typedef 来给结构体取别名,方便兼容和扩展
一、结构体的定义和使用
示例代码:
struct Dog {
char *name;
int age;
char color;
};
int main(){
struct Dog dog;
dog.color = 'r';
dog.name = "dog";
dog.age = 12;
printf("dog结构体的单独赋值:name=%s,age=%d,color=%c\n", dog.name, dog.age, dog.color);
return 0;
}
//输出结果: dog结构体的单独赋值:name=dog,age=12,color=r
二、结构体嵌套并直接声明变量
示例代码:
struct Student {
char *name;
struct HomeTown {
char *province;
char *city;
char *country;
char *detailStreet;
} Home;
//课程结构体
struct Course {
char *courseName;
char *teacher;
} Course;
} Zhangsan = {"张三",
{"四川省",
"成都市",
"高新区",
"xxxxx"
},
{"语文课",
"李老师"}
};
int main(){
//声明结构体时声明
printf("Student结构体声明时定义变量:student name= %s,来自:%s-%s-%s-%s,课程是:%s-%s\n",
Zhangsan.name,
Zhangsan.Home.province,
Zhangsan.Home.city,
Zhangsan.Home.country,
Zhangsan.Home.detailStreet,
Zhangsan.Course.courseName,
Zhangsan.Course.teacher);
return 0;
}
//输出结果: Student结构体声明时定义变量:student name= 张三,来自:四川省-成都市-高新区-xxxxx,课程是:语文课-李老师
三、结构体在堆栈区开辟
说明:
1) 自定义了结构体类型后,在后续的使用中通过struct+结构体名 来使用;
2)堆区开辟的结构体指针,需要free掉;
示例代码:
struct Dog {
char *name;
int age;
char color;
};
int main(){
//定义一条狗
struct Dog dog;
dog.color = 'r';
dog.name = "dog";
dog.age = 12;
//结构体指针:栈区开辟空间
struct Dog *dog1 = &dog;
dog1->name = "dog1";
dog1->age = 5;
dog1->color = 'b';
printf("dog1结构体指针的单独赋值:name=%s,age=%d,color=%c\n",
dog1->name, dog1->age, dog1->color);
//结构体指针:堆区开辟
struct Dog *dog2 = malloc(sizeof(struct Dog));
dog2->name = "堆区dog";
dog2->age = 3;
dog2->color = 'y';
printf("dog2结构体指针的单独赋值:name=%s,age=%d,color=%c\n",
dog2->name, dog2->age, dog2->color);
free(dog2);
dog2=NULL;
return 0;
}
//输出结果:
//dog1结构体指针的单独赋值:name=dog1,age=5,color=b
//dog2结构体指针的单独赋值:name=堆区dog,age=3,color=y
四、结构体数组
示例代码:
struct Dog {
char *name;
int age;
char color;
};
int main(){
struct Dog nDog;
struct Dog* redDog= &nDog;
redDog->name="red dog";
redDog->age=2;
redDog->color='r';
struct Dog *blackDog = malloc(sizeof(struct Dog));
blackDog->name="black Dog";
blackDog->age=3;
blackDog->color='b';
struct Dog* dogs[]={
redDog,
blackDog,
};
printf("下面输出结构体数组的内容:\n");
for (int i = 0; i < 2; ++i) {
printf("数组第%d个元素是:%s---%c----%d\n",i+1,dogs[i]->name,dogs[i]->color,dogs[i]->age);
}
printf("--------------下面输出数组的默认第一个元素\n");
printf("数组第一个元素的默认输出是:%s---%c----%d\n",(*dogs)->name,(*dogs)->color,(*dogs)->age);
free(blackDog);
blackDog=NULL;
return 0;
}
//输出结果:
//下面输出结构体数组的内容:
//数组第1个元素是:red dog---r----2
//数组第2个元素是:black Dog---b----3
//--------------下面输出数组的默认第一个元素
//数组第一个元素的默认输出是:red dog---r----2
温馨提示:
C语言中的结构体,大家用面向对象编程语言的数据bean来协助理解,会觉得挺容易的
网友评论