1.4结构体与指针
1.4.1结构体概念
结构体(struct)
结构体是由基本数据类型构成的、并用一个标识符来命名的各种变量的组合。结构体中可以使用不同的数据类型。
1.4.2结构体几种定义方式
第一种:只有结构体定义
struct stuff{ char job[20]; int age; float height; }; |
第二种:附加该结构体类型的“结构体变量”的初始化的结构体定义
//直接带变量名 struct Man{ char name[20]; int age; } m1, m2;
//下面这种写法:在定义结构体的同时声明结构体变量,并且给变量初始化 struct man{ char name[20]; int age; }m1 = { "李四", 20 }, m2 = {"王五",23}; |
第三种:匿名结构体, 控制结构体变量的个数(限量版),声明几个就只有几个
struct{ char name[20]; int age; }m1;
//下面这种写法声明两个结构体变量,并且初始化,那么这个结构体就只有这两个变量 struct { char name[20]; int age; }m1 = { "李四", 20 }, m2 = { "王五", 23 }; |
1.4.2结构体声明和内部成员变量的定义及访问:
1) 第一种方式(类似java构造方法)
//声明的同时初始化 struct man m1 = {"李四",20}; //或者先声明后初始化 struct man m2; m2= {"王五",23}; |
2) 第二种方式
struct man m2; strcpy(m2.name,"王五"); m2.age = 19; |
1.4.3结构体嵌套
结构体的成员变量也是结构体,这时就叫结构体嵌套
struct teacher{ char name[20]; };
struct man{ char name[20]; int age; struct teacher t;
};
void main() { struct man m ; m.age = 16; strcpy(m.name, "张三"); strcpy(m.t.name, "李四"); printf("%s,%d,%s\n", m.name, m.age,m.t.name); getchar(); } |
1.4.3结构体指针
struct man{ char name[20]; int age; };
void main() { struct man m = { "张三", 19 }; struct man* p = &m; printf("%s,%d\n", m.name, m.age); printf("%s,%d\n", (*p).name, (*p).age); printf("%s,%d\n", p->name, p->age); getchar(); }
三种输出方式是等价的, “p->”是“(*p).”简写形式 |
1.4.4结构体数组与指针
结构体数组遍历
struct man{ char name[20]; int age; };
void main() { struct man mans[] = { { "张三", 23 }, { "李四", 24 } }; int i = 0; for (; i < 2; i++){ printf("%s,%d\n",mans[i].name,mans[i].age); } getchar(); }
//下面这种方式遍历数组,采用指针 void main() { struct man mans[] = { { "张三", 23 }, { "李四", 24 } }; struct man *p = mans; p = mans; for (; p < mans + 2; p++){ printf("%s,%d\n", p->name, p->age); } getchar(); }
|
1.4.5结构体与动态分配内存
struct man{ char *name; int age; };
void main() { //开辟内存,mp相当于一个结构数组名 struct man *mp = (struct man *)malloc(sizeof(struct man) * 10); struct man *p = mp; p->name = "jack"; p->age = 20; p++; p->name = "Rose"; p->age = 19; struct man *loop_p = mp; for (; loop_p < mp + 2; loop_p++){ printf("%s,%d\n", loop_p->name, loop_p->age); } free(mp); getchar(); } |
1.4.6 结构体中使用函数
struct a void hello(char *name) int main()
|
1.4.7 typedef类型取别名
typedef 类型取别名主要作用是为了书写简洁
typedef int Age; Age a = 20;//可以直接用Age代替int使代码表达更简洁,更直观
typedef struct Man{ char name[20]; int age; } Man; Man m1 = {“张三”,20};
//简写 typedef struct Woman{ char name[20]; int age; } W, *WP; //W 是woman结构体的别名, WP 是woman结构体指针的别名
typedef struct Girl{ char * name; int age; void(*sayHi)(char*,char*);//函数指针 }Girl;
void sayHi(char* content, char* title){//函数具体实现 MessageBox(0, content, title, 0); }
void main() { Girl g = { "lisi", 20,sayHi }; printf("%s,%d\n", g.name, g.age); g.sayHi("haha", "heihei");//调用函数 getchar(); } |