C语言结构体小白详解

结构体

结构体的声明

人–对象,一些值去描述对象

名字+年龄+性别+电话+地址

书–对象,一些值去描述对象

书名+作者+出版社+定价

结构体类型是一种自定义类型

结构的基础知识

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

struct tag//struct结构体关键字,tag为结构体名
{
    member-list;
}variable-list;//变量列表

书-声明了一个结构体变量

#include<string.h>
#include<stdio.h>
struct Book
{
  	char name[20];//书名
   	short price;//定价
}b4,b5,b6;//也是结构体变量,b4,b5,b6是全局变量
int main()
{
    struct Book b;//创建一本书--局部变量
    struct Book b1;//创建一本书
    struct Book b2;//创建一本书
    //字符串拷贝
    //把“C语言”拷贝到name数组中
   	strcpy(b.name,"C语言");
    b.price=55;
    printf("%s\n",b.name);
    printf("%d\n",b.price);
    
    return 0;
}

另一种定义结构体方法

typedef struct Book
{
  	char name[20];//书名
   	short price;//定价
}Book;//typedef类型重定义,Book与struct Book一样

	 Book b1;//创建一本书
     Book b2;//创建一本书
    //字符串拷贝
    //把“C语言”拷贝到name数组中
   	strcpy(b.name,"C语言");
    b.price=55;
    printf("%s\n",b1.name);
    printf("%d\n",b1.price);

结构成员的类型

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

struct B
{
    int a;
    char c;
};
struct S
{
    int a;//标量
    char arr[20];//数组
    int* p;//指针
    struct B sb;//结构体
};
int main
{
    return 0;
}

结构体变量定义和初始化

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

给结构体变量初始化时需要用{}大括号

struct B
{
    int a;
    char c;
};
struct S
{
    int a;//标量
    char arr[20];//数组
    int* p;//指针
    struct B sb;//结构体
};
int main
{
    struct B b;//结构体变量定义
    struct B b={20,'w'};//初始化
    struct S s;//结构体变量定义
    struct S s={100,"haha",NULL,{10,'b'}};//初始化
    printf("%d %s %d %c\n",s.a,s.arr,s.sb.a,s.sb.c);
    return 0;
}

结构体成员的访问

结构体成员的访问:

1.点(.)操作符:结构体变量.成员名

struct Stu
{
    char name[20];
    int age;
};
int main()
{
    struct Stu s={"张三",20};
    printf("%s %d",s.name,s.age);
    return 0;
}

函数值传递访问打印

struct Stu
{
    char name[20];
    int age;
};
void print1(struct Stu stu)
{
    printf("%s %d",stu.name,stu.age);
}
int main()
{
    struct Stu s={"张三",20};
    print1(s);//值传递,传值调用
    return 0;
}

2.箭头->操作符:结构体指针->成员名

结构体地址传递

struct Stu
{
    char name[20];
    int age;
};
void print2(struct Stu* ps)
{
  //printf("%s %d",(*ps).name,(*ps).age);//或者
    printf("%s %d",ps->name,ps->age);
}
int main()
{
    struct Stu s={"张三",20};
    print2(&s);//结构体地址传递
    return 0;
}

结构体传参

值传递:

struct Stu
{
    char name[20];
    int age;
};
void print1(struct Stu stu)
{
    printf("%s %d",stu.name,stu.age);
}
int main()
{
    struct Stu s={"张三",20};
    print1(s);//值传递,传值调用
    return 0;
}

地址传递:

struct Stu
{
    char name[20];
    int age;
};
void print2(struct Stu* ps)
{
  //printf("%s %d",(*ps).name,(*ps).age);//或者
    printf("%s %d",ps->name,ps->age);
}
int main()
{·
    struct Stu s={"张三",20};
    print2(&s);//结构体地址传递
    return 0;
}

上面的print1和print2函数哪个好些?

答案是:print2。为什么呢?

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小赵小赵福星高照~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值