C语言结构体小白详解

Posted 小赵小赵福星高照~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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。为什么呢?

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

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

以上是关于C语言结构体小白详解的主要内容,如果未能解决你的问题,请参考以下文章

c语言结构体字节对齐详解

C语言小白必看——操作符详解(操作符优先级)

C语言,结构体

❤️《算法和数据结构》小白零基础教学,三十张彩图,C语言配套代码,之 二叉树详解❤️(建议收藏)

❤️《算法和数据结构》小白零基础教学,三十张彩图,C语言配套代码,之 二叉树详解❤️(建议收藏)

梦开始的地方 —— C语言结构体详解