【C语言】结构体_#include C语言结构体



一、为什么需要结构体

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

例:

使用结构体前

#include <stdio.h>
int main(coid){
//学生1的信息
int age;
float score;
char name[100];
//学生2的信息
int age2;
float score2;
char name2[100];
/*混乱易错*/
return 0
}


使用结构体后:

#include <stdio.h>

struct student{
int age;
float score;
char sex;
};

int main(coid){

struct student st = {80,66.6,'f'};//简洁明了

return 0
}


二、何为结构体

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

三、如何定义结构体

三种形式:

形式一:

//主要使用此形式,这种形式只是定义了一个新的数据类型,并没有定义变量
struct student{
int age;
float score;
char sex;
};

struct student st1 = {80,66.6,'f'};
struct student st2 = {80,66.6,'f'};
struct student st3 = {80,66.6,'f'};


形式二:

//此形式定义结构体的同时进行了变量定义,不方便再次定义别的变量
struct student{
int age;
float score;
char sex;
}stu;


形式三:

//允许在定义结构变量时省略结构名,由于没有给出结构名,在以后无法在定义这个类型的其他结构变量,除非把定义过程再写一遍
struct {
int age;
float score;
char sex;
}stu;


四、如何使用结构体

  • 赋值和初始化
  • 如何取出结构体变量中的每一个成员
  • 结构体变量的运算
  • 结构体变量和结构体变量指针作为函数参数传递的问题

1.赋值和初始化:

#include <stdio.h>

struct student{
int age;
float score;
char sex;
};

int main(void){

struct student st1 = {80,66.6,'f'}; //定义的同时赋出值
//先定义后单个赋值
struct student st2;
st2.age = 10;
st2.score = 88;
st2.sex = 'f';

/*error
struct student st2;
st2 = {10,88,'f'};
st2此时为结构体的首地址,此赋值方式出错
*/

printf("%d %f %c\n",st1.age,st1.score,st1.sex);
printf("%d %f %c\n",st2.age,st2.score,st2.sex);

return 0;
}


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

  1. ​结构体变量名.成员名​
  2. ​指针变量名->成员名​(常用)
  • 指针变量名->成员名在计算机内部会被转化为​(*指针变量名).成员名​
  • ​pst->age​​的含义:pst所指向的那个结构体变量中age这个成员
#include <stdio.h>

struct student{
int age;
float score;
char sex;
};

int main(void){
struct student st = {80,66.6,'f'};
struct student * pst = &st;

pst->age = 88;//pst->age在计算机内部会被转化为(*pst).age
st.score = 66.6f;//66.6默认为double类型,所以加f
printf("%d %f",st.age,pst->score);

return 0;
}


3.结构体变量和结构体变量指针作为函数参数传递的问题:

#include <stdio.h>

struct student{
int age;
char sex;
char name[100];
}

void inputstudent(struct student *);//函数声明时可不写形参名
void outputstudent(struct studnet *)

int main(void){
struct student st;

inputstudent(&st);//对结构体变量输入
outputstudent(st);//利用值对结构体变量输出
outputstudent(&st);//利用地址对结构体变量输出
printf("%d %c %s\n",st.age,st.sex,st.name);

return 0;
}

void inputstudnet(struct studnet * pstu)
{
(*pstu).age = 10;
strcpy(pstu->name,"张三");//不能写成 stu.name = "张三";
pstu->sex = 'f';
}

void outputstudent(struct studnet ss)
{
printf("%d %c %s\n",ss.age,ss.sex,ss.name);
/*
与printf("%d %c %s\n",st.age,st.sex,st.name);输出结果相同,相当于把st拷贝给ss,只有改变值时才需要指针
*/
}

void outputstudent(struct studnet * ss2)//与上面的形式有何不同,二者有何区别?
{
printf("%d %c %s\n",ss2->age,ss2->sex,ss2->name);
}


应该发送内容还是发送地址?

通常情况下是发送地址

优点:

  1. 表示一些复杂的数据结构
  2. *数据传递快,耗用内存小,执行速度快,如果发送内容太大时,一个一个复制给新变量,开销会很大
  3. *可以是函数返回一个以上的值
  4. 能够直接访问硬件
  5. 处理字符串更方便"abcde\0",只需知道a的地址就可以了字符串存储方式:
  1. 字符数组
  2. 指针
  1. 是理解面向对象语言中引用的基础

总结:指针是C语言的灵魂

4.结构体变量的运算:

 结构体变量不能相加,不能相减,也不能相互乘除

 但可以相互赋值,加减整数

struct student{
int age;
char sex;
char name[100];
};

int main(coid){
struct student st1, st2;

st1 + st2;//error
st1 - st2;//error
st1 * st2;//error

st1 = st2;//ok
st2 = st1;//ok

return 0;
}


------------------------------------------------------------------------------------------------------------

本文作者:ZyNu11

------------------------------------------------------------------------------------------------------------