
目录
C语言提供了int,float,double,char等内置类型,但如果我们想描述学生,我们可以描述学生的身高,体重,成绩,名字等等,这单一的内置类型是不足以描述的。所以此时要用到结构体(自定义的数据类型)来进行描述,让我们一起学习一下结构体吧!
一.定义:
结构体是不同数据类型的集合,这些不同类型称为成员变量。结构体的每个成成员可以是不同类型的变量,如整型,字符型,数组,指针,甚至是结构体(嵌套了一个结构体)。
二.结构体类型定义
我们以学生为例子来创建结构体:
struct student//结构体类型的建立
{
int num;
char name[30];
char gender;
float score;//不同类型的变量
};//注意有个分号
三.结构体变量的定义和初始化
1.结构体变量的定义:
(1)局部变量:
struct student
{
int num;
char name[30];
char gender;
float score;
};
struct student stu1;//建立stu1结构体变量,此时只能在它所在的作用域里使用
(2)全局变量
struct student
{
int num;
char name[30];
char gender;
float score;
}stu2;//建立stu2结构体变量,此时是全局变量
(3)还有一个不常见的方式定义(一般整个代码如果只有一个结构体类型那才可以使用)
struct //没有student
{
int num;
char name[30];
char gender;
float score;
}stu3;
2.结构体变量的初始化:
(1)默认顺序初始化
按照结构体中每个变量从上到下依次初始化
struct student
{
int num;
char name[30];
char gender;
float score;
};
struct student stu1 = { 20,"lisi",'f',98.8 };
struct student
{
int num;
char name[30];
char gender;
float score;
}stu2 = {18,"zhangsan",'m',90.1};
(2)指定顺序初始化:
通过“.结构体中变量名=”来改变初始化的顺序
struct student
{
int num;
char name[30];
char gender;
float score;
};
struct student stu1 = { .name = "lisi", .num=20, .score=98.8, .gender='f' };
//通过“.结构体中变量名=”来改变初始化的顺序
补充:结构体嵌套初始化和结构体指针
struct point
{
int x;
int y;
}
struct student
{
struct point p;//结构体变量(结构体中嵌套了另一个结构体)
struct point* p1;(结构体指针)
};
struct student stu4 = {{1,2},NULL};
四.结构体成员访问操作符
1.结构体成员直接访问:此时需要点操作符(.)访问。
使用方式:结构体变量名.成员名
#include<stdio.h>
#include<string.h>
struct student
{
int num;
char name[30];
char gender;
float score;
};
int main()
{
struct student stu1 = { 20,"lisi",'f',98.8 };
printf("%d %s %c %f\n", stu1.num, stu1.name, stu1.gender, stu1.score);//打印
stu1.num = 22;//重新赋值
strcpy(stu1.name, "wangwu");//注意:字符串赋值需要用strcpy函数,但字符指针不用
/*比如:struct student
{
char* name;
}
stu1={"zhangsan"};
stu1.name="wangwu";
*/
stu1.gender = 'm';
stu1.score = 66.6;
printf("%d %s %c %f", stu1.num, stu1.name, stu1.gender, stu1.score);
return 0;
}
2.结构体成员的间接访问:当我们得到的是指向结构体的指针而不是结构体变量时,我们需要(->)符号来间接访问结构体成员。
使用方式:结构体指针->成员名
#include<stdio.h>
#include<string.h>
struct student
{
int num;
char name[30];
char gender;
float score;
};
int main()
{
struct student stu1 = { 20,"lisi",'f',98.8 };
struct student* ptr = &stu1;//结构体指针
ptr->num = 28;
strcpy(ptr->name, "wangwu");
ptr->gender = 'm';//也可以使用(*ptr).gender='m';
ptr->score = 77.7;
printf("%d %s %c %f", stu1.num, stu1.name, stu1.gender, stu1.score);
return 0;
}
3.补充:
当两个结构体类型相同时,可以将一个已知结构体直接赋值给另一个结构体。
struct student
{
int num;
char name[30];
char gender;
float score;
}stu1,stu2;
struct student stu1 = { 20,"lisi",'f',98.8 };
stu2=stu1;//把stu1赋值给stu2
五.结构体指针
表示形式:struct 结构体名 *指针变量名
1.结构体指针的建立和初始化
struct student
{
int num;
char name[30];
char gender;
float score;
};
struct student stu1 = { 20,"lisi",'f',98.8 };
struct student* p = &stu1;//结构体指针建立和初始化
2.结构体指针访问成员:
需要访问操作符(->) 或 (*指针).成员
3.优势:传参
当结构体包含大量数据(如嵌套结构体、长数组)时,传递结构体变量(值传递)会复制整个结构体,开销大;而传递结构体指针(地址传递)仅需传递4/8字节(取决于系统位数)的地址,效率极高。同时,也可以修改原结构体数据(双向传递)。
六.结构体传参
#include<stdio.h>
struct student
{
int num;
char name[30];
char gender;
float score;
};
struct student stu1 = { 20,"lisi",'f',98.8 };
void print(struct student* stu1)//形参为结构体指针
{
printf("%d", stu1->num);
}
int main()
{
print(&stu1);//实参为结构体地址
return 0;
}
文章到这里就结束了,创作不易,如果喜欢的话点个关注,点个赞,谢谢大家!
11万+

被折叠的 条评论
为什么被折叠?



