目录
C语言结构体学习
概念
结构体是一种构造类型,它是由若干成员组成的。其成员可以是一个基本数据类型,也可以是一个构造类型。声明结构体使用的关键字是struct,其一般形式如下:
struct 结构体名
{
成员列表
};
-
注意声明结构体时,要注意大括号最后有个分号“;”
示例
struct student
{
char name[10];
char class[10];
int age;
}
结构体变量定义
声明一个结构体表示的是创建一种新的类型名,要用新的类型名再定义变量。定义有三种方式:
方式一
声明后,直接定义。如声明了一个student结构体
struct student student1
struct student student2
方式二
在声明结构类型时,同时定义变量
形式如下:
struct 结构体名
{
成员列表
}变量名列表
例如:
struct student
{
char name[10];
char class[10];
int age;
}student1,student2;
方式三
直接定义结构体类型变量
形式如下:
struct
{
成员列表
}变量名列表;
例如:
struct
{
char name[10];
char class[10];
int age;
}student1,student2;
结构体变量的引用
结构体变量的引用不能直接将一个结构体变量作为一个整体进行输入和输出。例如不能进行如下输出
printf("%s%s%d",student1);
要对结构体变量进行赋值、存取或运算,实质上就是对结构体变量成员进行操作。一般形式如下:
结构体变量.成员名
例如:
student1.name="Tim";
如果成员本身又属于一个结构体类型,需要使用若干个成员运算符,一级一级地找到最低一级的成员。 结构体变量的成员可以像普通变量一样,进行各种运算。 可以对结构体变量成员的地址进行引用,也可以对结构体变量的地址进行引用,例如:
scanf("%s",&student1.name);//输入student1的名字
printf("%o",&student);//输出student1的首地址
结构体的初始化
在定义时初始化
struct student
{
char name[10];
char class[10];
int age;
}student1={tim,class1,6};
定义结构体变量时初始化
struct student student1={tim,calss,6};
结构体数组
定义一个结构体数组的方式和定义结构体变量的方法相同,只是结构体变量替换成数组。定义结构体数组一般形式如下:
struct 结构体名
{
成员列表
}数组名
例如:
srtuct student
{
char name;
char class;
int age;
}student[5];
初始化结构体数组
srtuct student
{
char name;
char class;
int age;
}student[2]={
{tim,class1,6},
{tom,class2,7},
};
结构体指针
一个指向变量的指针表示的是一个变量所站内存的起始地址。如果一个指针指向结构体变量,那么该指针指向的结构体变量的起始地址。同样的,指针变量也可以指向结构体数组中的元素。
指向结构体变量的指针
定义结构体指针的一般形式如下:
结构体类型 *指针名;
例如:
struct student *pStruct;
使用指向结构体变量的指针访问成员有两种方法,pStruct为指向结构体变量的指针
方法一 . 点运算
使用点运算符引用结构成员:
(*pStruct).成员名
例如:
struct student *pStruct;
pStruct=&student1;
结构体变量可以使用点运算符对其中的成员进行引用。*pStruct表示指向的结构体变量,因此使用点运算符可以应用结构体中的成员变量。 注意 *pStruct一定要使用括号,因为点运算符的优先级是最高的,如果不使用括号,就会先执行点运算然后是*
运算 说明
声明结构的位置可以放在main函数外也可以放在main函数内。
方法二 -> 指向运算符
使用指向运算符引用结构成员:
pStruct->成员名;
例如:使用指向运算符引用一个变量的成员
pStruct->name=tim;
形式等价
假如student为结构体变量,pStruct为指向结构体变量的指针,可以看出以下3种形式的效果是等价的。
-
student.成员名
-
(*pStruct).成员名
-
pStruct->成员名
指向结构体数组的指针
结构体指针变量不但可以指向一个结构体变量,还可以指向结构体数组,此时指针变量的值就是结构体数组的首地址。如下:
struct student *pStruct; pStruct=student;//数组不加下标,此时指向数组的首地址 如果想利用指针指向第三个元素,则在数组名后附加下表,然后再数组名前使用取地址符号& pStruct=&srudent[2]
示例程序
#include<stdio.h>;
//结构体
struct student
{
char name[10];
char class[10];
int age;
}student[2]={{"tim","class1",6},
{"tom","class2",7},};
//主函数
int main()
{
struct student* pStruct;
int a;
pStruct=student;
for(a=0;a<2;a++,pStruct++;)
{
printf("NO%d student\n",a+1);
printf("Name:%s,Class:%s\n",pStruct->name,pStruct->class);
printf("Age:%d\n",pStruct->age);
}
return 0;
}
结构体作为函数参数
使用结构体作为函数参数有3种形式:
1.使用结构体变量作为函数参数
使用结构体变量作为函数的实参时,采用的是“值传递”方式,即会将结构体变量所占内存单元的内容全部顺序传递给形参,形参也必须是同类型的结构体变量。例如:
void Display(struct Student stu);
在形参的位置使用结构体变量,但是函数调用期间,形参也要占用内存单元。这种传递方式在空间和时间上开销都比较大。
另外,根据函数参数传值方式,如果在函数内部修改了变量中的成员的值,则改变的值不会返回到主调函数中。
例程:
#include<stdio.h>
//定义结构体
struct Student
{
char name[10];
char class[10];
int age;
}
//引用函数
void Display(struct Student stu)
{
printf("name:%c\n",stu.name);
printf("class:%c\n",stu.class);
printf("age:%d\n",stu.age);
}
//主函数
int main()
{
Display(student); //调用函数,结构变量作为实参进行传递
return 0;
}
2.使用指向结构体变量的指针作为函数参数
在传递结构体变量的指针时,只是将结构体变量的首地址进行传递,并没有将变量的副本进行传递。例如:
void Display(struct student* stu);
这样使用形参stu指针就可以引用结构体变量中的成员了。这里需要注意的是,因为传递的是变量的地址,如果在函数中改变了成员中的数据,那么返回主调函数时变量会发生改变。
例程:
#include<stdio.h>
//定义结构体
struct student
{
char name[10];
char score[3];
}student={"tim",89,95,93};
void Display(struct Student* stu)
{
printf("name:%c\n",stu->name);
printf("score:%c\n",stu->score[2]);
stu->score[2]=97;
}
int main()
{
struct student* pStruct=&student;
Display(pStruct);
printf("Changed score: %.2f\n",pStruct->score[2]);
return 0;
}
3.使用结构体变量的成员作为函数参数
使用在何种方式为函数传递参数与普通的变量作为实参是一样的,是传值方式传递。例如:
Display(student.score[0]);
PS:传值时,实参要与形参的类型一致。
包含结构的结构
例程:
#include<stdio.h>
struct date
{
int year;
int month;
int day;
};
struct student
{
char name[30];
int num;
char sex;
struct date birthday;
}student=f"SuYuQun",12061212,W,[1986,12,6};
int main()
{
printf("-----Information-----\n");
printf("Name:%sln"student.name);
printf("Number:%dn",student.num);
printf("Sex:%cln",student.sex);
printf("Birthday:%d,%d,%d\n",student.birthday.year,
student.birthday.month,student.birthday.day);
return 0;
}