C语言:结构体

结构体

为什么需要结构体

​ 为了表示一些复杂的事物,而普通的基本类型无法满足实际要求

什么叫结构体

​ 把一些基本类型数据组合在一起形成的一个新的复合数据类型,这个叫做结构体

如何定义结构体

struct Student{
  int age;
  char name[20];
  float score;
};							//最后的分号不能省
struct Student2{
  int age;
  char name[20];
  float score;
}str2;				//定义结构体的同时定义变量,变量名为str2,数据类型为struct Student2
struct {
  int age;
  char name[20];
  float score;
}str;					//没有给出结构体名称,直接定义变量

赋值和初始化

定义的同时可以整体赋初始值

struct Student{
  int age;
  char name[20];
  float score;
};	
struct Student st= {20,"zhangsan",55.5};
//每一个数据都要与结构体中的成员数据相对应
struct Student2{
  int age;
  char name[20];
  float score;
}str2 = {20,"zhangsan",55.5};

定义完之后只能单个赋初始值

需单独取出每一个成员进行赋值

如何取出结构体变量中的每一个成员

  1. 结构体变量名.成员名

  2. 指针变量名->成员名(更常用)

    ​ 指针变量名->成员名 在计算机内部会被转化成 (*指针变量名).成员名 来执行

    ​ 所以这两种方法是等价的

struct Student{
  int age;
  char name[20];
  float score;
};	
int main(void){
  struct Student st= {20,"zhangsan",55.5};//初始化同时赋初始值
  
  //定义后单独赋值
  struct Student * pst = &st;//结构体指针
  struct Student = {20,"zhangsan",55.5};
  st.age = 20;//第一种方式
  pst->age = 20;//第二种方式
  		//pst->age 会被转化成 (*pst).age,也就等价于st.age
  return 0}

结构体作为函数参数

  1. 使用结构体变量作为函数参数

    采用 值传递 方式,即将结构体变量所占的内存单元的内从全部顺序传递给形参

 void f(struct Student stu){
   
 }

调用函数期间,形参也要占内存单元,在空间和时间上开销都比较大

而且值传递方式,如果在函数内修改了变量中成员的值,改变的值不会返回到主调函数中、

  1. 使用结构体指针作为函数参数

    只将结构体变量的首地址进行传递,减少内存占用,

    如果在函数中改变成员变量的值,也会返回到主调函数中,

void f(struct Student * stu){
  
}

推荐使用结构体指针变量作为函数参数来传递

结构体变量的运算

​ 结构体变量不能相加、相减,乘除;

​ 可以进行相互赋值

struct Student{
  int age;
  char name[20];
  float score;
};
struct Student str,str2;

str1 + str2		str1*str2 	str1/str2	//都是错误的
  
 str1 = str2	或 	str2 = str1;//都是正确的
相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页