日记大全

日记大全 > 句子大全

在写C语言程序的时候(还记得定义结构体类型有哪些吗)

句子大全 2011-05-12 17:51:24
相关推荐

在写C语言程序时,很多场景都用到结构体,结构体也属于“复合类型”,作用是可以将多个相同或不同类型的数据存放在一块连续的内存空间中。

结构体

常用的结构体的定义和初始化一般有以下几种方式:

// 1、第一种struct Tea // 为结构体类型名{ 成员列表};struct Tea t; // 为结构体变量名// 2、第二种struct Tea { 成员列表}Math,Chinese;// 3、第三种struct { 成员列表}Math, Chinese;

需要注意的是:定义结构struct Tea,它只是一个类型,一个模板,没有空间,不可以给结构体成员赋值。

结构体数组:

结构体数组是一个数组,数组的每一个元素都是结构体,比如以下代码所示:

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <string.h>#include <stdlib.h>struct Per { int age; char name[128];};int main() { struct Per p[3] = { { 10,"小明" },{ 20,"小华" },{ 30,"小花" } }; for (int i = 0;i < sizeof(p) / sizeof(p[0]);i++) { printf("%s %d\n", p[i].name, p[i].age); } return 0;}

结构体套结构体:

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <string.h>#include <stdlib.h>struct Per { int age; char name[128];};struct Tea { struct Per p; char chinese[128];};int main() { struct Tea t; t.p.age = 20; strcpy(t.p.name, "dawang"); printf("%s %d\n", t.p.name, t.p.age); return 0;}

结构体里相同类型的变量是可以相互赋值的,比如如下代码所示:

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <string.h>#include <stdlib.h>struct Per { int age; char name[128];};int main() { struct Per p1 = { 20,"lili" }; struct Per p2; p2 = p1; // 相同类型的变量是可以相互赋值 printf("%s %d\n", p2.name, p2.age); return 0;}

结构体指针:

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <string.h>#include <stdlib.h>struct Per { int age; char name[128];};int main() { struct Per *p = (struct Per *)malloc(sizeof(struct Per)); p->age = 20; strcpy(p->name, "sasa"); printf("%s %d\n", p->name, p->age); free(p); return 0;}

当然还有更为复杂点的,比如如下代码所示:

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <string.h>#include <stdlib.h>struct Tea { int num;};struct Per { int age; char *name; struct Tea *t;};int main() { struct Per *p = (struct Per *)malloc(sizeof(struct Per)); p->age = 20; p->name = (char *)malloc(128); strcpy(p->name, "sasa"); p->t = (struct Tea *)malloc(sizeof(struct Tea)); p->t->num = 666; printf("%d %s %d\n", p->age, p->name, p->t->num); free(p->name); free(p->t); free(p); return 0;}

当结构体数组作为函数的“形参”时,比如代码可以是这样的:

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <string.h>#include <stdlib.h>struct Per{ int age; char name[128];};void set_func(struct Per *p, int num){ for (int i = 0; i < num; i++) { p[i].age = i + 1; char nums[128] = ""; sprintf(nums, "%d%d", i, i); strcpy(p[i].name, nums); }}int main(){ struct Per num[3]; memset(num, 0, sizeof(num)); set_func(num, sizeof(num) / sizeof(num[0])); for (int i = 0;i < sizeof(num) / sizeof(num[0]);i++) { printf("%s %d\n", num[i].name, num[i].age); } return 0;}

const

总结:值得注意的地方是,当有const修饰的结构体指针变量的时候,比如:

struct Per p1;

struct Per const *p = &p1; 就不能通过 p->age = 20; 因为const修饰的是*,它不能通过指针p去修改p指向的那块空间。同理,struct Per * const p = &p1;就不能通过 p = &p1; 因为const修饰的是指针变量p,不能修改p本身的内容。

阅读剩余内容
网友评论
相关内容
拓展阅读
最近更新