一 、 结构体是什么?
1.与C语言中的数组,用法跟其他语言差不多。当一个整体由多个数据构成时,可以用数组来表示这个整体,
但是数组有个特点:内部的每一个元素都必须是相同类型的数据。
2.通常需要由不同类型的数据来构成一个整体,比如学生这个整体可以由姓名、年龄、身高等数据构成,
这些数据都具有不同的类型,姓名可以是字符串类型,年龄可以是整型,身高可以是浮点型。
3.C语言专门提供了一种构造类型来解决上述问题,就是结构体,它允许内部的元素是不同类型的。
二 、 结构体有什么用?
1.更好的管理内存,解决基本数据类型和数组都不好存储的数据
三 、 结构体怎么用?
方法一:先定义结构体类型再定义变量名
struct student
{int num;
char name[20];
char sex;
int age;
char addr[30];
};
struct student student1, student2;
有时,可用符号常量代表一个结构体类型 ,如:
#define STUDENT struct student
STUDENT
{int num;
char name[20];
char sex;
int age;
char addr[30];
};
方法二:在定义类型的同时定义变量
struct student
{int num;
char name[20];
char sex;
int age;
char addr[30];
} student1, student2;
方法三:直接定义结构类型变量。
其一般形式是:
struct
{
成员表列
} 变量名表列;
- 结构体变量的指针:是该结构体变量所占居的内存段的起始地址,指向该结构体
int main( )
{
struct student
{
long int num;
char name[20];
char sex;
};
struct student stu_1;
struct student *p;
p=&stu_1;
return 0;
}
- 引用结构体成员的三种形式:
1) 结构体变量名 . 成员名
2) (*p).成员名
3) p- >成员名 - 结构体的初始化
struct student
{long int num;
char name[20];
char sex;
char addr[20];
} stu={9801,”Wang hong”,’W’,”2 Linggong Road”};
或者
struct student
{long int num;
char name[20];
char sex;
char addr[20];
};
struct Student stu ={9801,”Wang hong”,’W’,”2 Linggong Road”}
四 、 使用结构体要注意什么?
1. 类型与变量是不同概念,不要混淆;
2. 结构体中的成员,可以单独使用,其作 用与地位相当于普通变量;
3. 成员名可以与程序中的变量名相同,二 者不代表同一对象。
4. 成员也可以是一个结构体变量;
5. 不能将一个结构体变量作为一个整体进行赋值和输出;只能对其各个成员分别输出
6. 只能在定义变量的同时进行初始化赋值,初始化赋值和变量的定义不能分开
五 、 结构体代码举例
- 例1一般应用
//一个结构体
struct Student {
char *name;
int age;
};
struct Student stu;
// 访问stu的age成员
stu.age = 27;
//两个结构体搭配
struct Date {
int year;
int month;
int day;
};
struct Student {
char *name;
struct Date birthday;
};
struct Student stu;
//注意成员变量的访问
stu.birthday.year = 1986;
stu.birthday.month = 9;
stu.birthday.day = 10;
- 例2结构体作为函数参数(值传递)
#include <stdio.h>
// 定义一个结构体
struct Student {
int age;
};
void test(struct Student stu) {
printf("修改前的形参:%d \n", stu.age);
// 修改实参中的age
stu.age = 10;
printf("修改后的形参:%d \n", stu.age);
}
int main(int argc, const char * argv[]) {
struct Student stu = {30};
printf("修改前的实参:%d \n", stu.age);
// 调用test函数
test(stu);
printf("修改后的实参:%d \n", stu.age);
return 0;
}
- 例3 利用指向结构体数组的指针计算学生各科的平均成绩
#include <stdio.h>
int main()
{
struct STUDENT *pt;
float sum[4] = {0.0},average[4] = {0.0};
int i;
char *name[]={"score of Computer","score of English",
"score of Math","score of Music"};
pt = stu; /*pt指向结构体数组的第一个元素*/
for (pt=stu; pt<stu+30; pt++)
{
sum[0] = sum[0] + pt->scoreComputer;//用->访问成员变量
sum[1] = sum[1] + pt->scoreEnglish;
sum[2] = sum[2] + pt->scoreMath;
sum[3] = sum[3] + pt->scoreMusic;
}
for (i=0; i<4; i++)
{
average[i] = sum[i]/4;
printf("%20s : %4.2f\n", name[i], *(average+i));//格式输出,平均分保留两位
}
return 0;
}
六 、 结构体总结
1.不允许对结构体本身递归定义
2.结构体内可以包含别的结构体
3.定义结构体类型,只是说明了该类型的组成情况,并没有给它分配存储空间,就像系统不为int类型本身分配空间一样。
只有当定义属于结构体类型的变量时,系统才会分配存储空间给该变量
4.结构体变量占用的内存空间是其成员所占内存之和,而且各成员在内存中按定义的顺序依次排列
5.初始化:将各成员的初值,按顺序地放在一对大括号{}中,并用逗号分隔,一一对应赋值
6.一般对结构体变量的操作是以成员为单位进行的,引用的一般形式为:结构体变量名.成员名
7.如果某个成员也是结构体变量,可以连续使用成员运算符"."访问最低一级成员
8.相同类型的结构体变量之间可以进行整体赋值
9.将结构体变量作为函数参数进行传递时,其实传递的是全部成员的值,也就是将实参中成员的值一一赋值给对应的形参成员。
因此,形参的改变不会影响到实参。
10.每个结构体变量都有自己的存储空间和地址,因此指针也可以指向结构体变量
11.typedef 的用法 ,功能:定义新类型,即为C语言中已有的数据类型 名定义一个新名字。 定义格式: typedef 标识符1 标识符2