C语言:结构体类型struct(构造类型的一种).2021-06-20

结构体数组都是构造类型的一种.

作为函数参数形参时: 数组传递是原数组的地址, 结构体(结构体非const指针 除外)传的是实际的数值并给了新的变量.

数组中所有元素都是同一数据类型,结构体中的成员的数据类型可以相同也可不同.

1.结构体的一般定义

(一)

#include<stdio.h>


int main()
{
	
}

//结构体定义
struct {

	//成员列表
	int num;
	char name[20];
	char sex;
	int age;
	float score;
	char addr[30];	


}sudent1,student2; //变量名列表,定义结构体变量

(二)

#include<stdio.h>


int main()
{
	
}

//结构体定义
struct student{

	//成员列表
	int num;
	char name[20];
	char sex;
	int age;
	float score;
	char addr[30];	


}sudent1,student2; //变量名列表,定义结构体变量

(三)

#include<stdio.h>


int main()
{
	
}

//结构体类型声明
struct student{

	//成员列表
	int num;
	char name[20];
	char sex;
	int age;
	float score;
	char addr[30];	


}; 

//定义结构体类型变量
struct student student1;
struct student student2;

(四)

#include<stdio.h>


int main()
{
	
}


struct date{
	int month;
	int day;
	int year;
};

struct student{

	
	int num;
	char name[20];
	char sex;
	int age;
	struct date birthday;
	float score;
	char addr[30];	

}; 

struct student student1;
struct student student2;

2.结构体变量的引用(结构体变量名.成员名)

#include<stdio.h>

struct date{
	int month;
	int day;
	int year;
};
struct student{

	
	int num;
	char name[20];
	char sex;
	int age;
	struct date birthday;
	float score;
	char addr[30];	

}; 

struct student student1;
struct student student2;

int main()
{
	printf("%d \n",sizeof(struct student));//struct student长度

	student1.num=1;// "." 成员运算符,高运算优先级
	student1.birthday.year=1;
	printf(
		"%d %d\n",
		student1.num,
		student1.birthday.year);
}

start without debugging

3.结构体变量地址

结构体变量的地址 和 本结构体变量的第一个成员地址相同(类似数组)

#include<stdio.h>

struct date{
	int month;
	int day;
	int year;
};
struct student{

	
	int num;
	char name[20];
	char sex;
	int age;
	struct date birthday;
	float score;
	char addr[30];	

}; 

struct student student1;
struct student student2;

int main()
{

	student1.num=1;
	student1.birthday.year=1;
	printf(
		"%d %d\n",
		&student1.num,
		&student1);
}

start without debugging

3.1结构体变量的初始化

#include<stdio.h>

struct {
 
	int num;
	char name[20];
 
}student1,student2={1,"xxx"};//结构体变量student2初始化


int main()
{
	printf("%d %s \n",student2.num,student2.name);
	student1=student2;//结构体变量s...2赋值给结构体变量s..1
	printf("%d %s \n",student2.num,student2.name);
}

start without debugging

4. 结构体数组 定义

#include<stdio.h>

struct {
	char name[10];
	char num[3];
 
}person[2];//结构体数组 定义


int main()
{
	int i;
	for(i=0;i<2;i++)
	{
		puts("input name:");
		gets(person[i].name);

		puts("input num:");
		gets(person[i].num);
	
	}
	puts("\tname\t\t\t\t\tnum\n");
	for(i=0;i<2;i++)
	{
		printf("%20s\t\t\t%20s\n",person[i].name,person[i].num);
		//%20s右对齐输出字符串,左边补空格,单行占20
	}
}

4.1 结构体数组定义并初始化

#include<stdio.h>

struct {
	char name[10];
	char num[3];
 
}person[2]={{"a","1"},{"b","2"}};//结构体数组定义时初始化


int main()
{
	int i;
	
	puts("\tname\t\t\t\t\tnum\n");
	for(i=0;i<2;i++)
	{
		printf("%20s\t\t\t%20s\n",person[i].name,person[i].num);
		
	}
}

5.结构体类型指针

#include<stdio.h>

struct stu{
	char name[10];
	char num[3];
 
}person={"a","1"};

int main()
{
	struct stu *per;
	//定义结构体类型指针:指向结构体类型struct stu

	per=&person;//结构体变量地址赋值给指针

	puts("\tname\t\t\t\t\tnum\n");
	printf("%20s\t\t\t%20s\n",person.name,person.num);

	printf("%20s\t\t\t%20s\n",(*per).name,per->num);
	//两种方式,注意方式(*per).name中的括号必须要有,因为 . 运算符的运算优先级比 * 高
	//用指针引用变量中的成员

}

6.结构体做函数参数

6.1结构体变量做函数参数

#include<stdio.h>
#include<string.h>

struct stu{
	char name[5];
	int num;
	float score[2];
};

int main()
{
	int print1(struct stu a);
	struct stu one;

	one.num=8;
	strcpy(one.name,"abc");//易错处
	one.score[0]=8;
	one.score[1]=9;

	print1(one);//结构体变量做实参
}

int print1(struct stu a)//结构体变量做形参
{
	printf("%d \n",a.num);
	printf("%s \n",a.name);
	printf("%f  %f \n",a.score[0],a.score[1]);
}

#include<stdio.h>

struct stu{
	char *name;
	int num;
	float score[2];
};

int main()
{
	int print1(struct stu a);
	struct stu one;

	one.num=8;
	one.name="abc";
	one.score[0]=8;
	one.score[1]=9;

	print1(one);//结构体变量做实参
}

int print1(struct stu a)//结构体变量做形参
{
	printf("%d \n",a.num);
	printf("%s \n",a.name);
	printf("%f  %f \n",a.score[0],a.score[1]);
}

6.2结构体类型指针做函数参数

#include<stdio.h>

struct stu{
	char *name;
	int num;
	float score[2];
};

int main()
{
	int print1(struct stu *a);
	struct stu one;

	one.num=8;
	one.name="abc";
	one.score[0]=8;
	one.score[1]=9;

	print1(&one);//结构体变量做实参
}

int print1(struct stu *a)//结构体变量做形参
{
	printf("重新输入一个编号(int): ");
	scanf("%d",&a->num );//易错处

	printf("%d \n",a->num);
	printf("%s \n",(*a).name);
	printf("%f  %f \n",(*a).score[0],a->score[1]);
}

7.名称优化

C语言: typedef 与 #define宏定义 .2021-06-08_慕容雪羽-CSDN博客 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mklpo147

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值