C语言结构体、指针和结构体指针的基本操作
一、结构体
结构体就是一些值的集合,这些值称为成员变量。这些成员变量可以是不同数据类型的变量,类似于C++中的“封装”。它是将不同数据类型封装在一个类型中。
1、结构体的声明
声明一个结构体类型的一般形式为:
struct 结构体名
{
成员列表
};//分号不能省略
例如声明一个学生信息的结构体:
struct STUDENT
{
char name[20];
int num;
char sex;
int age;
float score;
char addr[30];
};
2、结构体的定义
与函数声明相同,在结构体声明后的位置,都可以直接使用。一般都是在所有函数前面声明结构体类型,方便调用。结构体定义的方式通常有两种。
(1). 方法一:先声明,再定义
此方法定义的结构体变量通常为局部变量。例如在所有函数前面声明上述学生信息的结构体struct STUDENT,在其后的所有函数中可以定义该结构体变量:
struct STUDENT stud1,stud2;
(2). 方法二:声明的同时进行定义
此方法定义的变量通常为全局变量。例如:
struct STUDENT//此处的结构体类型STUDENT可省略,成为直接定义结构体变量的方式
{
char name[20];
int num;
char sex;
int age;
float score;
char addr[30];
}stud1,stud2;
注意:
-只有结构体变量才分配地址,结构体类型的声明不分配空间
-结构体中各成员变量的定义也不分配空间
-结构体变量的声明需要在主函数之上或主函数中声明
3、结构体变量的运算
结构体仅可以进行相互赋值操作,前提是两个结构体变量的结构体类型必须相同。
4、结构体变量的引用
(1). 引用成员变量
结构体变量包含多个成员变量,在引用时只能一个成员一个成员的引用,不能将一个结构体变量作为一个整体进行引用,引用方式为:结构体变量名.成员名
例如:
stud1.num=12345; //“.”为成员运算符
注意:
- 如果结构体类型中的成员也是一个结构体类型,则要用若干个“.”,一级一级地找到最低一级的成员,只能对最低级的成员进行操作。
- 当结构体类型中的成员也是结构体类型时,可以将结构体成员释放出来,例如:
struct AGE
{
int year;
int month;
int day;
};
struct STUDENT
{
char name[20];
int num;
char sex;
struct AGE birthday;
float score;
char addr[30];
};
等同于:
struct STUDENT
{
char name[20];
int num;
char sex;
int year;
int month;
int day;
float score;
char addr[30];
};
(2). 引用地址
可以引用“结构体变量成员”的地址,也可以引用“结构体变量”的地址。例如:&stud1.num 和 &stud1。前者表示num成员在内存中的首地址,后者表示结构体变量stud1在内存中的首地址。
注意:
- 在 C 语言中,结构体变量的首地址就是结构体第一个成员的首地址。所以 &student1 就等于第一个成员 name 的首地址。
- name 是一个数组,数组名表示的就是数组的首地址。所以 &student1 和 student1.name 是等价的。
但是要注意的是,它们只是表示同一个内存空间的地址,它们的类型是不同的,不能在程序中相互替换。(&student1 是结构体变量的地址 ,是 struct STUDENT* 型的;而 student1.name 是数组名,所以是 char* 型的。)
二、指针
指针表示内存地址,指针变量是存放内存地址的变量,不同类型的指针变量占用相同的存储单元长度(指针在32位平台占用4字节,在64位平台占用8字节)。指针既可以对数据本身进行操作,也可以对存储数据的地址进行操作。
1、指针变量的定义
指针变量的一般定义形式为:type + *。该格式仅表示定义一个指针变量,没有间接取值的含义。
char *pc=NULL;//定义空指针
int *pi=NULL;
float *pf=NULL;
double *pd=NULL;
注意:
- “=”右侧必须为内存中的数据地址,不可以是变量,也不可以直接用整型地址值。
- 例如:
int a=20;
int *pi=&a;//取变量a所在的地址
int b[2];
int *pi=&b[0];
2、指针的赋值
int year; //定义变量
year = 2024; //赋值
int *pi; //定义指针
pi = &year; //赋值,取year变量的地址
3、使用指针修改内存位置的内容
举个例子:
int main()
{
int a = 20;
int *p =&a;//定义一个指针p,指向变量a的地址
*p = 10;//通过指针修改它所指向的地址的内容
printf("%d\n", a);//此时,a的输出值为10
return 0;
}
三、结构体指针
1、结构体指针的定义
结构体指针就是指向结构体的指针变量,一般形式为:struct 结构体名 *变量名。例如:
struct stu{ //结构体
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在小组
float score; //成绩
} stu1 = { “Tom”, 12, 18, ‘A’, 136.5 };
struct stu *pstu = &stu1; //结构体指针
//定义结构体的同时定义结构体指针
struct stu{ //结构体
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在小组
float score; //成绩
} stu1 = { “Tom”, 12, 18, ‘A’, 136.5 },*pstu = &stu1; //结构体指针
2、获取结构体成员
使用结构体指针获取结构体成员的一般形式有两种:
(1). “.”点形式
(*pointer).membername
该形式中的括号不能省略,运算符“.
”的优先级要高于“*
”。
(2). “->”箭头形式
(*pointer)->membername
"->
"是特定用来获取结构体成员的运算符。