结构体struct零基础搞定C语言——12
Posted 林慢慢i
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结构体struct零基础搞定C语言——12相关的知识,希望对你有一定的参考价值。
本期内容主要是结构体!简单介绍了结构体的声明和传参、结构体变量的定义、初始化以及结构体成员的访问。
文章目录
结构体的声明
结构体:跟数组类似,也是一些值的集合,但是值的类型可以不同,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
- 结构体是一种构造数据类型
- 把不同类型的数据组合成一个整体
结构的声明
例如描述一个学生:
typedef struct Stu
{
char name[20];//名字
int age;//年龄
char id[20];//学号
} s1,s2;//s1和s2也是结构体变量
注释:结构的成员可以是标量、数组、指针,甚至是其他结构体。
结构体变量的定义、初始化以及结构体成员的访问
为了访问结构的成员,我们使用成员访问运算符(.)或(->)
引用形式:<结构体类型变量名>.<成员名>
<结构体类型变量名>-><成员名>
注意:结构体变量不能整体引用,只能引用变量成员
成员访问运算符是结构变量名称和我们要访问的结构成员之间的一个句号。可以使用 struct 关键字来定义结构类型的变量。
可以定义指向结构的指针,方式与定义指向奇特类型变量的指针类似,
定义形式:struct 结构体名 *结构体指针名;
直接上代码:
//声明 B
struct B
{
char c;
short s;
double d;
};
//声明 Stu
struct Stu
{
//成员变量
struct B sb;
char name[20];//名字
int age;//年龄
char id[20];
} s1,s2;//定义结构体变量s1和s2
//s1,s2是全局变量
int main()
{
//初始化,s是局部变量
struct Stu s = { {'w', 20, 3.14}, "张三", 30, "202005034"};//对象
//. -> 结构体的访问
printf("%c\\n", s.sb.c);
printf("%s\\n", s.id);
//结构体指针访问指向变量的成员,有时候我们得到的不是一个结构体变量,而是一个指向一个结构体 的指针
struct Stu* ps = &s;//定义指向结构体的指针
printf("%c\\n", (*ps).sb.c);
printf("%c\\n", ps->sb.c);
return 0;
}
注意:结构体和结构体变量是两个不同的概念:结构体是一种数据类型,是一种创建变量的模板,编译器不会为它分配内存空间,就像 int、float、char 这些关键字本身不占用内存一样;结构体变量才包含实实在在的数据,才需要内存来存储。
结构体传参
直接上代码:
struct B
{
char c;
short s;
double d;
};
struct Stu
{
//成员变量
struct B sb;
char name[20];//名字
int age;//年龄
char id[20];
};
//结构体传参
void print1(struct Stu t)
{
printf("%c %d %lf %s %d %s\\n", t.sb.c, t.sb.s, t.sb.d, t.name, t.age, t.id);
}
//结构体地址传参
void print2(struct Stu* ps)
{
printf("%c %d %lf %s %d %s\\n", ps->sb.c, ps->sb.s, ps->sb.d, ps->name, ps->age, ps->id);
}
int main()
{
//s是局部变量
struct Stu s = { {'w', 20, 3.14}, "张三", 30, "202005034" };//对象
//写一个函数打印s的内容
print1(s);//传结构体
print2(&s);//传地址
return 0;
}
上面的print1和print2函数哪个好些?
答案是print2函数,因为函数传参的时候,参数是需要压栈的。如果传递一个结构体对象的时候,结构体过大,参数压栈的系统开销比较大,会导致性能下降。
附上图中代码:
int Add(int x, int y)
{
int z = 0;
z = x + y;
return z;
}
int main()
{
int a = 3;
int b = 5;
int c = 0;
c = Add(a, b);
return 0;
}
例题1
如有以下代码:
struct student
{
int num;
char name[32];
float score;
}stu;
则下面的叙述不正确的是:( )
作业内容
A.struct 是结构体类型的关键字
B.struct student 是用户定义的结构体类型
C.num, score 都是结构体成员名
D.stu 是用户定义的结构体类型名
答案解析:
A:正确,在C语言中需要自定义类型时,要用到struct关键字
B:正确:在C语言中,用struct定义的结构体,定义结构体类型变量时,需要用struct student
C:正确:结构体中的变量名称,称之为结构体的成员
D:错误:stu是定义的结构体类型变量,不是名称,如果想要让stu为结构体类型名称时,必须在结构体定义时添加 typedef关键字
结构体到此介绍结束了,感谢您的阅读!!!如果内容对你有帮助的话,记得给我三连(点赞、收藏、关注)——做个手有余香的人。
以上是关于结构体struct零基础搞定C语言——12的主要内容,如果未能解决你的问题,请参考以下文章