一篇文章带你初始结构体(一)

目录

1.结构体的声明

1.1结构的基础知识

1.2结构的声明

1.3结构成员的类型

1.4结构体变量的定义和初始化

2.结构体成员的访问

如何对结构体成员变量进行修改?

3.结构体传参


1.结构体的声明

1.1结构的基础知识

目前C语言我们知道的类型有:char,short,long,int,double,float

这些都可以创建变量,但是很单一的

知道这些类型,难道这些类型能表示这世界上所有的东西吗?

不能,比如说人,学生,

他们是一些复杂对象,描述清楚需要许多变量

学生:年龄+名字+性别+成绩.....

名字存起来用字符数组

年龄存起来(整数)用整型

性别存起来用字符数组

成绩存起来可能有小数用浮点数

四个整合在一起描述学生

如何把这些东西整合到一起?这时候出现了结构体

结构体是一些值的集合,这些值称为成员变量,结构的每个成员可以是不同类型的变量

1.2结构的声明

struct tag
{
    member-list;
}variable-list;

这里的struct结构体关键字

这里的struct tag结构体类型名

member_list  结构体成员变量,也可以叫结构体成员列表

variable_list结构体的变量列表

例如:描述一个学生

struct Stu
{
    char name[20];//名字
    int age;//年龄
    char sex[8];//性别
    float score;//成绩
}s1,s2,s3;//这里的分号不要丢!

s1,s2,s3是通过struct Stu 类型创建的变量

这里的s1,s2,s3是全局变量

int main()
{
    struct Stu s4;
    struct Stu s5;//这里的struct不能省略
    return 0;
}

这里的s4 s5是局部变量

上面的struct Stu才是结构体类型,不能随便省略struct

但是可以使用typedef类型重定义(类型重命名)

这里不是把struct省略掉了 而是把struct Stu重命名了 struct Stu == Stu

还有一种方法

但这时候不能创建变量列表

这里不是结构体类型变量 而是重命名

1.3结构成员的类型

结构的成员可以是标量,数组,指针,甚至是其他结构体

1.4结构体变量的定义和初始化

有了结构体类型,那如何定义变量,其实很简单

struct Point
{
    int x;//横坐标
    int y;//纵坐标
}p1;//声明类型变量的同时定义变量p1,p1是全局变量
int main()
{
    struct Point p;//定义结构体变量p,p是局部变量
    return 0;
}

初始化:定义变量的同时赋初值。

数组有多个变量用大括号来初始化,结构体也一样 使用大括号来初始化

struct Point
{
    int x;//横坐标
    int y;//纵坐标
}p1 = { 10,15 };//给结构体变量p1横坐标赋值为10,纵坐标赋值为15
int main()
{
    struct Point p = { 100,200 };//给结构体变量p横坐标赋值为100,纵坐标赋值为200
    return 0;
}

简单的结构体初始化我们会了,复杂一点的呢?

struct Point
{
    int x;//横坐标
    int y;//纵坐标
}p1 = { 10,15 };//给结构体变量p1横坐标赋值为10,纵坐标赋值为15
struct S
{
    char c;
    struct Point sp;
    double d;
    char arr[20];
};
int main()
{
    struct Point p = { 100,200 };//给结构体变量p横坐标赋值为100,纵坐标赋值为200
    struct S ss = { 'w',{50,20},5.5,"hello CSDN" };//嵌套调用   Point
    return 0;
}

这里看到都创建成功了

如果结构体成员里,有指针,记得放上空指针

2.结构体成员的访问

结构成员访问操作符

当我们访问结构体变量的时候用 .

当我们访问结构体指针的时候用 ->

.    结构体变量 结构体成员

->  结构体指针 -> 结构体成员

使用结构体变量.结构体成员来打印

打印结构体成员变量中的结构体时,注意先找到结构体之后,再使用结构成员访问操作符找到结构体中的成员

如果创建个函数要传参打印结构体成员变量呢?

这时候我们可以用 . 操作符,传值调用

这里形参是实参的一份临时拷贝

也可以使用->操作符

这里是传址调用,需要用结构体指针来接收。

把ss地址传给ps,通过地址可以找到ss,

使用->结构体访问操作符,来进行打印

如何对结构体成员变量进行修改?

可以直接使用 . 操作符进行修改

可不可以使结构体变量中的数组直接进行修改?

不可以,因为使用结构体访问到的是一个数组,数组名本质上是首元素地址,不能对地址进行赋值和修改,应该使用字符串拷贝函数strcpy把要修改的内容放到arr这块空间中去。

注意使用strcpy要引用库函数头文件 #include

#include <stdio.h>
#include <string.h>
int main()
{
    struct Point p = { 100,200 };//给结构体变量p横坐标赋值为100,纵坐标赋值为200
    struct S ss = { 'w',{50,20},5.5,"hello CSDN" };
    ss.c = 'b';
    ss.sp.x = 200;
    ss.sp.y = 100;
    ss.d = 3.14;
    strcpy(ss.arr, "hello,bit");
    return 0;
}

3.结构体传参

print1 print2都是结构体传参?哪个更好一点?

如果像p1,结构体结构很大,再拷贝一份浪费的空间会很大

函数传参的时候,参数是需要压栈的。

如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。

p2的话,不管结构体有多大,只有四个字节或者八个字节,更加节省空间

结论:

结构体传参的时候,要传结构体的地址

个人水平不足 如果代码中有错误,可以多多在评论区指出,一定会及时修改!
谢谢大家看到这里 觉得有收获的话可以三连一下 一起加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值