C语言(结构体)

结构体

用户自己建立由不同类型数据组成的组合型数据结构。

格式:

struct  结构体类型名{
    数据类型1 成员1;
    数据类型2 成员2;
    数据类型3 成员3;
    数据类型4 成员4;
    ......
    数据类型n 成员n;
}
复制代码
struct Date
{
	int  year;
	int  month;
	int  day;
};

struct Student
{
	int num;
	char name[20];
	char sex;
	int age;
	float score;
	char addr[30];
};
复制代码

说明:

由于客观世界非常复杂,可以设计出许许多多结构体类型,例如:struct Teacher、struct Worker、struct Date等结构体类型;

各自包含不同的成员,应视具体情况而定;

成员可以属于另一个结构体类型。

类型定义不分配内存,只是建立了一个结构体类型,它相当于一个模型,并没有定义变量,其中并无具体数据,系统对它也不分配存储单元;

若要在程序中使用结构体类型的数据,应当定义结构体类型的变量,并在其中存放具体的数据。

结构体变量

1、先声明结构体类型,再定义该类型变量

例如:struct Student student1,student2;

//初始化结构体的变量

struct Student
{
	char name[20];
	int age;
};

void main(){
	struct Student s = {"xiaoming",20};
	printf("name:%s\n age:%d",s.name,s.age);
	getchar();
}
复制代码

struct Student
{
	char name[20];
	int age;
};

void main(){
	struct Student s;
	s.age = 16;
	strcpy(s.name,"xiaoming");
	printf("name:%s\n age:%d",s.name,s.age);
	getchar();
}
复制代码

2、在声明类型的同时定义变量

struct  结构体名
{
	成员表列
} 变量名表列;

例如:
struct Student
{
	int num;
	char name[20];
	char sex;
	int age;
	float score;
	char addr[30];
} student1, student2;

复制代码

说明:这种方式适用于小程序,对大型程序不适用,一般不采用。

struct Student
{
	char name[20];
	int age;
}s1, s2 = {"xiaoming",18};

void main(){
	s1.age = 16;
	strcpy(s1.name,"xiaofang");
	printf("name:%s\n age:%d",s2.name,s2.age);
	getchar();
}
复制代码

3、不指定结构体类型名而直接定义结构体类型变量(匿名结构体)。

由于未指定了的结构体名称,只能定义一次该类型的变量,通常不采用这种方式。

struct
{
	成员表列
}变量名表列;

复制代码
struct
{
	char name[20];
	int age;
}s1;

void main(){
	s1.age = 16;
	strcpy(s1.name,"xiaofang");
	printf("name:%s\n age:%d",s1.name,s1.age);
	getchar();
}

复制代码

说明: 结构体类型与结构体变量是不同的概念,不要混同。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。在编译时,对类型是不分配空间的,只对变量分配空间;

结构体类型中的成员名可以与程序中的变量名相同,但二者不代表同一对象;

对结构体变量中的成员(即“域”),可以单独使用,它的作用与地位相当于普通变量。

结构体嵌套

struct Teacher{
	char name[20];
};

struct Student
{
	char name[20];
	int age;
	struct Teacher t;
};

void main(){
	struct Student s1 = { "xiaoming", 18, { "Jason" } };
	printf("name:%s\n age:%d",s1.name,s1.age);
	getchar();
}
复制代码

struct Teacher{
	char name[20];
};

struct Student
{
	char name[20];
	int age;
	struct Teacher t;
};

void main(){
	struct Student s1;
	s1.age = 18;
	strcpy(s1.name,"xiaofang");
	strcpy(s1.t.name, "MissLee");
	printf("name:%s\n age:%d\n Teacher:%s",s1.name,s1.age,s1.t.name);
	getchar();
}

复制代码

struct Student{
	char name[20];
	int age;
	struct Teacher{
		char name[20];
	} t;
};

void main(){
	struct Student s1;
	s1.age = 18;
	strcpy(s1.name,"xiaofang");
	strcpy(s1.t.name, "MissLee");
	printf("name:%s\n age:%d\n Teacher:%s",s1.name,s1.age,s1.t.name);
	getchar();
}
复制代码

结构体与指针

struct Teacher{
	char name[20];
};

struct Student{
	char name[20];
	int age;
};

void main(){
	struct Student s1 = {"xiaoming",18};
	struct Student* p = &s1;

	printf("name:%s\n age:%d\n", s1.name, s1.age);

	printf("name:%s\n age:%d\n", (*p).name, (*p).age);
	//“->”(箭头)是“(*p).”简写形式
	printf("name:%s\n age:%d\n", p->name, p->age);
	getchar();
}

复制代码

struct Student{
	char name[20];
	int age;
};

void main(){
	struct Student s1;
	s1.age = 18;
	strcpy(s1.name,"xiaofang");
	struct Student* p = &s1;
	printf("name:%s\n age:%d\n",p->name,p->age);
	getchar();
}
复制代码

结构体数组和指针

概念:顾名思义是数组中的每一个元素都是结构体变量

struct Student{
	char name[20];
	int age;
};

void main(){
	struct Student s[] = { {"xiaoming",18}, {"xiaofang",17}, {"xiaoai",16} };
	struct Student* p = s;

	for (; p < s + 3; p++){
		printf("name:%s\n age:%d\n", p->name, p->age);
	}

	printf("------------------------------------------\n");
	int i = 0;
	for (; i < sizeof(s) / sizeof(struct Student); i++){
		printf("name:%s\n age:%d\n", s[i].name, s[i].age);
	}
	
	getchar();
}

复制代码

struct Student{
	//char name[20];
	int age;
	double weight;
};

void main(){
	struct Student s = { 18,90.00};
	//结构体变量的大小,必须是最宽基本数据类型的整数倍
	//提升读取的效率
	printf("%#x,%d\n", &s, sizeof(s));
	getchar();
}
复制代码

结构体与动态内存分配

struct Student{
	char name[20];
	int age;
};

void main(){
	struct Student *s = (struct Man*)malloc(sizeof(struct Student) * 10);
	struct Student *p = s;
	//赋值
	p->age = 18;
	strcpy(p->name,"xiaoming");
	p++;
	p->age = 16;
	strcpy(p->name, "xiaofang");

	struct Student *loop_p = s;
	for (; loop_p < s + 2; loop_p++){
		printf("%s,%d\n", loop_p->name, loop_p->age);
	}
	free(s);
	getchar();
}
复制代码

结构体函数指针成员

//Student结构体类似于Java中的类,name和age类似于属性,sayHi类似于方法
struct Student{
	char* name;
	int age;
	void(*sayHi)(char*);
};

void sayHi(char* msg){
	MessageBoxA(0, msg, "title", 0);
}

void main(){
	struct Student s1;
	s1.name = "xiaoming";
	s1.age = 18;
	s1.sayHi = sayHi;

	printf("name:%s  age:%d\n", s1.name, s1.age);
	s1.sayHi("hello world");
	getchar();
}

复制代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值