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语言配套代码,之 二叉树详解❤️(建议收藏)