C语言【初阶】——结构体

文章介绍了C语言中结构体的基本概念,包括如何声明结构体、定义和初始化结构体变量,以及结构体成员的访问方式。通过示例展示了结构体变量的初始化,如按顺序和指定成员初始化,并讨论了结构体作为参数在函数传递中的考量,强调了大结构体传参可能带来的性能影响。
摘要由CSDN通过智能技术生成

目录

结构体的声明

   1.结构的基础知识

    2.结构的声明 

    3.结构成员的类型

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

结构体变量的定义 

拓展 

结构体的初始化及成员打印 

   1.按照指定顺序初始化及打印

   2.指定成员来初始化及打印 

结构体的成员访问 

    1.结构体变量访问成员

    2.结构体指针访问指向变量的成员

 

结构体传参

结构体的声明

   1.结构的基础知识

  • 结构的概念:结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
  • 结构的作用:用来描述复杂对象

    2.结构的声明 

e.g(描述学生的结构)

struct Stu
{
  char name[20];//名字
  int age;//年龄
  char sex[5];//性别
  char id[15];//学号
};

    3.结构成员的类型

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

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

  • 结构体变量的定义 

e.g(1) 

struct Stu
{
  //学生的相关属性
  char name[20];//名字
  int age;//年龄
  char sex[5];//性别
  char id[15];//学号
}s1,s2;

s1和s2 是 struct Stu 类型的结构体变量 

这里的s1和s2是全局变量

e.g(2)

struct Stu
{
	//学生的相关属性
	char name[20];//名字
	int age;//年龄
	char sex[5];//性别
	char id[15];//学号
};
int main()
{
	struct Stu s1;
	struct Stu s2;
	return 0;
}

 s1和s2 也是 struct Stu 类型的结构体变量

这里的s1和s2是局部变量

  • 拓展 

typedef struct 
{
	//学生的相关属性
	char name[20];//名字
	int age;//年龄
	char sex[5];//性别
	char id[15];//学号
}Stu;
int main()
{
	 Stu s3;
	 Stu s4;
	return 0;
}

 这里我们使用 typedef 进行结构类型的重命名,Stu是重命名后结构体类型名

s3和s4是 Stu 类型的结构体变量

  • 结构体的初始化及成员打印 

   1.按照指定顺序初始化及打印
struct Book
{
  char book_name[21];
  char author[15];
  int price;
//...
};
//一个汉字占2个字符
int main()
{
  int num=20;
  struct Book s1={"老人与海","海明威",30};
  struct Book s2={"四世同堂","老舍",20};
  printf("%s %s %d\n",s1.book_name,s1.author,s1.price);
//结果:老人与海 海明威 30
  struct Book b = { "鹏哥C语言","鹏哥",66 };
	struct Book* psb = &b;
	printf("%s %s %d\n", psb->book_name,psb->author, psb->price);//结构体指针的形式
//结果为:鹏哥C语言 鹏哥 66
  return 0;
}
   2.指定成员来初始化及打印 
struct Book
{
	char book_name[21];
	char author[15];
	int price;
	//...
};
//一个汉字占2个字符
int main()
{
	int num = 20;
	struct Book s1 = {.book_name="老人与海",.price=30};//未初始化的成员默认初始化为0
	printf("%s %s %d\n", s1.book_name, s1.author, s1.price);
	//结果:老人与海 30
	return 0;
}

 

结构体的成员访问 

    1.结构体变量访问成员

  • 结构变量的成员是通过点操作符(.)访问的.

e.g

void set_s(struct S* x)
{
	(*x).age = 18;
	//(*x).name = "zhangsan";  error
	//name是数组名(地址),也就是一个常量,常量不可以更改
	strcpy((*x).name, "zhangsan");//将"zhangsan"这个字符串拷贝到(*x).name那块空间里去
}
int main()
{
	struct S s = { 0 };
	//写一个函数给s中存放数据
	set_s(&s);
	return 0;
}

    2.结构体指针访问指向变量的成员

  •  结构体指针访问指向变量的成员是通过箭头操作符(->)访问的。

e.g

void set_s(struct S* x)
{
	x->age = 18;
	strcpy(x->name, "zhangsna");
}
int main()
{
	struct S s = { 0 };
	//写一个函数给s中存放数据
	set_s(&s);
	return 0;
}

 

结构体传参

struct S
{
	char name[20];
	int age;
};

struct S
{
	int data[1000];
	int num;
};
struct S s = { {1,2,3,4}, 1000 };

//结构体传参
void print1(struct S s)
{
	printf("%d\n", s.num);
}

//结构体地址传参
void print2(struct S* ps)
{
	printf("%d\n", ps->num);
}

int main()
{
	print1(s); //传结构体
	print2(&s); //传地址
	return 0;
}

 上述代码我们首选 print2函数,因为函数传参的时候,参数是需要压栈的。如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

胡闹的猫.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值