什么是结构体?
在C语言中,结构体是一种自定义的数据结构,允许程序员将不同的数据类型组成在一起,形成一个新的数据类型。
作用
多个相关数据的整合,使得代码数据逻辑更清晰
了解面向对象编程(java、python、c++等都是面向对象的编程语言)的程序员就知道,这个就可以看作是创建对象。
struct point{
int x; //x坐标
int y; //y坐标
}
也可以更好得整合复杂的数据结构(如链表、队列、树等)
使用
声明/定义/取别名
/* 1. 声明结构体;编译器知道这是一个未定义的类型,
同时也告诉编译器在后面的代码中有定义,
而不至于在编译的时候报未知类型的错误。*/
struct point;
/* 2. 引入别名,但类型本身仍未完整定义(包含声明);
别名即:point_t 等同于 struct point。 */
typedef struct point point_t;
struct point {
int x;
int y;
}; // 3. 完整定义结构体类型(定义本身包括声明)。
创建结构体变量并赋值
//用结构体类型原名
struct point p1;
p1.x = 10;
p1.y = 20;
//用别名
point_t p2;
p2.x = 10;
p2.y = 20;
//创建结构体时初始化结构体
struct point p1 = {10, 20};
point_t p2 = {10, 20};
//创建结构体指针,并赋值
struct point* p3;
p3->x = 10;
p3->y = 20;
使用实例
实例说明:
- 创建两个结构体(girl 和 boy),并通过相互之间的关系进行相互关联
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
struct girl{
char *name;
struct boy* boy_friend;
};
struct boy{
char *name;
struct girl* girl_friend;
};
struct girl* xiaoHong = (struct girl *)malloc(sizeof(struct girl));
xiaoHong->name = (char *)malloc(sizeof(char) * 10);
strcpy(xiaoHong->name, "xiaohong");
printf("%s\n",xiaoHong->name);
struct boy* xiaoMing = (struct boy *)malloc(sizeof(struct boy));
xiaoMing->name = (char *)malloc(sizeof(char) * 10);
strcpy(xiaoMing->name, "xiaoming");
printf("%s\n",xiaoMing->name);
xiaoHong->boy_friend = xiaoMing;
xiaoMing->girl_friend = xiaoHong;
// 验证互相引用是否正常
printf("xiaoHong's boy_friendfriend's name: %s\n", xiaoHong->boy_friend->name);
printf("xiaoMing's girl_friendfriend's name: %s\n", xiaoMing->girl_friend->name);
printf("xiaoHong's boy_friendfriend's girl_friendfriend's name: %s\n", xiaoHong->boy_friend->girl_friend->name);
printf("xiaoMing's girl_friendfriend's boy_friendfriend's name: %s\n", xiaoMing->girl_friend->boy_friend->name);
// 释放内存
free(xiaoHong->name);
free(xiaoMing->name);
free(xiaoHong);
free(xiaoMing);
return 0;
}
运行结果如下:
xiaohong
xiaoming
xiaoHong's boy_friendfriend's name: xiaoming
xiaoMing's girl_friendfriend's name: xiaohong
xiaoHong's boy_friendfriend's girl_friendfriend's name: xiaohong
xiaoMing's girl_friendfriend's boy_friendfriend's name: xiaoming