C语言结构体
一、为什么需要结构体
为了表示一些复杂的事物,而普通的基本类型无法满足实际要求
例:
使用结构体前
int main(coid){
//学生1的信息
int age;
float score;
char name[100];
//学生2的信息
int age2;
float score2;
char name2[100];
/*混乱易错*/
return 0;
}
使用结构体后:
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.赋值和初始化:
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.如何取出结构体变量中的每一个成员:
-
结构体变量名.成员名
-
指针变量名->成员名
(常用)
-
指针变量名->成员名
在计算机内部会被转化为(*指针变量名).成员名
-
pst->age
的含义:pst所指向的那个结构体变量中age这个成员
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.结构体变量和结构体变量指针作为函数参数传递的问题:
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);
}
应该发送内容还是发送地址?
通常情况下是发送地址
优点:
- 表示一些复杂的数据结构
- *数据传递快,耗用内存小,执行速度快,如果发送内容太大时,一个一个复制给新变量,开销会很大
- *可以是函数返回一个以上的值
- 能够直接访问硬件
- 处理字符串更方便"abcde\0",只需知道a的地址就可以了字符串存储方式:
- 字符数组
- 指针
- 是理解面向对象语言中
引用
的基础
总结:指针是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
------------------------------------------------------------------------------------------------------------