08 C语言结构体

本文详细介绍了C语言中的结构体,包括如何声明和初始化结构体,如何访问结构体成员,以及结构体在函数传参中的应用。通过实例展示了结构体嵌套、指针访问成员和结构体传参的不同方式,强调了传参时使用结构体指针的效率优势。
摘要由CSDN通过智能技术生成

C语言初识结构体

  1. 结构体类型的声明
  2. 结构体初始化
  3. 结构体成员访问
  4. 结构体传参

结构体的声明

结构

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

结构体的声明
struct 结构体标签{
    结构体成员列表;
}结构列表;

注:定义结构体实际上就是在声明,所以最后一定要有分号

举例

// struct 结构体关键字   Stu- 结构体标签  struct Stu -结构体类型
struct people{
    //成员变量
    char name[20];
    short age;
    char tele[12];
    char sex[5];
}p1,p2;//p1,p2是两个全局的结构体变量
int main(){
    // 创建结构体变量
    struct people pe;//局部的
    return 0;
}
使用typedef简化使用
typedef struct people{
    //成员变量
    char name[20];
    short age;
    char tele[12];
    char sex[5];
}People;//People是typedef后struct people的别名
int main(){
    // 创建结构体变量
    People pe;//直接使用别名
    return 0;
}

注意:使用了typedef那么创建结构体最后的分号前只能是别名,不能用来定义结构体变量。

结构体成员的类型

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

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

struct Point{
    int x;
    int y;
}p1;				//声明类型的同时定义变量p1
struct Point p2;	//定义结构体变量p2

struct Point p3={x,y};//初始化:定义变量的同时赋初值

struct people pe = {"Tom", 20, "15885458520", "男"};

总结:1. 声明类型的时候初始化。 2. 直接定义结构体变量 3. 定义变量的同时初始化

嵌套使用
struct A{
    int a;
    char c;
    char arr[20];
    double d;
};

struct B{
    char ch[10];
    struct A a;
    char *pc;
};
int main(){
    char arr[10];
    struct B b = {"hello", {100,'w',"world",2.22}, arr};
    return 0;
}

结构体中的成员变量的类型可以是其他的结构体。初始化时使用的其他的结构体也使用{}进行初值的赋值。

结构体成员访问

1.结构体变量访问成员 结构体变量的成员是通过操作符(.)访问的。点操作符接受两个操作数。

int main(){
    char arr[]="tian";
    struct B b = {"hello", {100,'w',"world",2.22}, arr};
    printf("%s\n",b.ch);
    printf("%s\n",b.a.arr);
    printf("%lf\n",b.a.d);
    printf("%s\n",b.pc);
    return 0;
}

image-20220104234053888

2.结构体指针访问变量的成员 有的时候我们得到的不是一个结构体变量,而是指向一个结构体的指针。(使用(->))

struct Stu{
    char name[20];
    int age;
};
void print(struct Stu* ps){
    printf("name = %s  age = %d\n",(*ps).name,(*ps).age);
    //使用结构体指针访问指向对象的成员
    printf("name = %s  age = %d\n",ps->name,ps->age);
}
int main(){
    struct Stu s = {"zhang", 20};
    print(&s);
    return 0;
}

结构体传参

struct Stu{
    char name[20];
    int age;
};
void print(struct Stu* ps){
    printf("name = %s  age = %d\n",(*ps).name,(*ps).age);
    //使用结构体指针访问指向对象的成员
    printf("name = %s  age = %d\n",ps->name,ps->age);
}
void print2(struct Stu ps){
    printf("name = %s  age = %d\n",ps.name,ps.age);
}
int main(){
    struct Stu s = {"zhang", 20};
    print(&s);
    print2(s);
    return 0;
}

两种传参方式达到了同样的效果。但是真的没有区别吗?

使用指针访问不需要开辟新的空间。直接访问地址。时间空间上都占优。

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

结论:结构体传参的时候,最好(要)传结构体的地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

黎丶辰

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

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

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

打赏作者

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

抵扣说明:

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

余额充值