我们已经学过结构体,结构体也叫结构,是一种数据类型。
结构类型定义的语法格式如下:
例如:
struct STU
{
char xh[10];
char xm[20];
float cj;
};
我这里定义了一个学生类型,类型名为STU,有3个成员:学号(xh, 字符串)、姓名(xm, 字符串)、成绩(cj,实数型)。
定义了结构类型,那么就可以定义结构类型的变量了。如:
struct STU
{
char xh[10];
char xm[20];
float cj;
};
struct STU x, y;
定义两个结构变量:x和y。
因为每个结构变量都由不同类型的成员组成,我们使用结构变量,其实就是为了使用这些成员,结构变量成员的引用语法格式为:
结构变量名 .结构成员名
如上例,我们定义了一个结构变量x,x的成绩为100分,可以这样引用:
x.cj = 100 ;
我们写程序时,可以把结构类型的定义写在main函数的外面,在main函数里定义结构变量。
以上是我们以前学过的。
今天学习一个新内容:结构指针。
一、结构指针的定义
结构指针是指向结构体变量的指针,其定义方式与普通指针类似,只需在指针类型前加上struct关键字和结构体名称。
// 定义结构体
struct Student {
char name[50];
int age;
float score;
};
// 定义结构指针
struct Student *ptr;
二、结构指针的使用
结构指针可以通过取地址运算符&来初始化,指向已存在的结构体变量。
通过结构指针访问结构体成员有两种方法:
(1)使用箭头运算符->
(2)使用间接运算符*配合点运算符.
我们先来看普通的结构变量:
假设有定义:
struct Student {
char name[50];
int age;
float score;
};
struct Student x;
struct Student *p;
上述定义中,x是普通的结构变量,p则是结构指针变量。
如果执行了:
p=&x;
即p指向了x,此时既可以直接用x来访问Student的成员,也可以间接利用p来访问Student的成员。
三、结构指针变量访问结构体成员
但是要注意,用x访问Student的成员name、age、score的形式如下:
x.name, x.age, x.score
但我们不能直接用p来访问这些成员,即不能:
p.name, p.age, p.score
而是只能:
(*p).name, (*p).age, (*p).score
因为p指向x, p实际上存放的是x的地址,而*p才是x。
所以
x.name, x.age, x.score
等价于:
(*p).name, (*p).age, (*p).score。
在C语言里,可以用p->箭头代替这里的(*p).
即:
x.name, x.age, x.score
等价于:
(*p).name, (*p).age, (*p).score。
也等价于:
p->name, p->age, p->score。
所以,如果在程序中发现了一个变量加一个箭头的,如p->,那么这个变量一定一个结构指针变量,它通过这个箭头->来访问结构体的成员。
程序1:
上述程序中:
也可以写成:
在上述程序中,出现了一些我们以前没讲过的地方,如:
以及:
这是因为我们这里应用了一个系统函数strcpy( ),这个系统函数在头文件<string.h>中定义,如果要用strcpy( )这个函数,就必须引入头文件:
#include <string.h>
strcpy(s1.name, "张三");的意思是将第二个参数(上述是字符串”张三”)赋值给第一个参数(s1.name)。
可能有朋友会问:
为什么不用:
s1.name=”张三”;
而必须用:
strcpy(s1.name, "张三");
来赋值?
大家看看s1.name是什么类型?没错,是字符数组,char name[50];
所以s1.name就是数组名,以前讲过,数组名是不能写在赋值号(=)左边的,它只能用strcpy(s1.name, "张三");来赋值,不能用s1.name=”张三”;来赋值。
以下是程序1代码,可以直接复制运行。
#include <stdio.h>
#include <string.h>
struct Student {
char name[50];
int age;
float score;
};
int main() {
// 定义结构体变量
struct Student s1;
strcpy(s1.name, "张三");
s1.age = 20;
s1.score = 89.5;
// 初始化结构指针
struct Student *ptr = &s1;
// 使用箭头运算符访问成员
printf("姓名: %s\n", ptr->name);
printf("年龄: %d\n", ptr->age);
printf("分数: %.1f\n", ptr->score);
}
这篇文章的内容有点不好理解,因为涉及到指针。
可以多看几遍,多复习一下之前讲过的指针的内容。