7.2.1 结构体与指针
指针可以指向一个对象,而若将结构体视为一个对象的话,就可以定义出指向结构体的指针。例如,我们有一个关于书的结构体,其定义代码如下:
该结构体类型名为 Book,有 3 个成员,分别是 int 类型的 isbn,用于存储书的发行刊号;char 类型长度为 20 的数组 author,用于存储书的作者;float 类型的 price,用于存储书的单价。
根据该类型,定义出一个结构体变量 book1,并对其进行初始化:
struct Book book1 = {12345678, "JiaBaoYu", 78.50f};
定义一个指针,并让其指向结构体变量 book1:
struct Book *pBook = &book1;
定义了 struct Book 类型的指针变量 pBook,并将结构体变量 book1 的内存地址作为其初始值。即可认为指针 pBook 指向了结构体变量 book1。那现在该考虑的,就是如何通过指针来访问结构体变量的成员了。
C 语言中,通过指针来访问结构体变量的成员有以下两种方式。
1.指针解引用方式
可以通过对指针的解引用来访问结构体变量,进而再通过结构体变量来访问各成员。例如:
(*pBook).isbn
在小括号内是对指针 pBook 进行解引用,解引用后相当于得到了结构体变量 book1,然后再通过成员访问运算符来访问 book1 的成员 isbn。
需要注意的是,这里的小括号不可省略,否则,成员访问运算符的执行优先级比解引用运算符高,该表达式就相当于变成下面这个样子:
*(pBook.isbn)
即将 pBook 看成一个结构体变量,然后访问其成员 isbn,并将其值视为一个指针,再进行解引用的操作。很显然,这是错误的。
下面使用指针解引用的方式来访问结构体变量 book1,并将 book1 的所有成员打印输出到控制台窗口:
printf("ISBN: %d\n", (*pBook).isbn); printf("Author: %s\n", (*pBook).author); printf("Price: %.2f\n", (*pBook).price);
编译运行程序,结果如下:
ISBN: 12345678 Author: JiaBaoYu Price: 78.50
可见,只要对指针进行解引用,就可以访问到它所指向的结构体变量,进而访问结构体变量的各个成员。但需要注意的是,必须将指针解引用操作用小括号括起来,进行优先级提升,不然就会出错。那有没有更好的方法,可以不需要对指针进行解引用,而直接访问到结构体变量的各个成员呢?
答案是肯定的,下面就来看看这种更好的访问方式吧。
2.非指针解引用方式
C 语言中,可以通过间接成员访问运算符来访问指针所指向的结构体变量的成员。间接成员访问运算符由短横线字符和大于号字符构成,即“->”,两个字符必须连在一起,中间不可有间隔或其他字符。由于其形状像一个箭头,因此也被称为箭头运算符。
下面就使用箭头运算符来访问结构体变量的成员。例如:
pBook->isbn
在指针 pBook 和结构体变量成员 isbn 间使用箭头运算符,即可通过指针 pBook 直接访问它所指向的结构体变量 book1 的成员 isbn,省去了对指针进行解引用的麻烦,更加的方便和快捷。
下面就使用箭头运算符来访问并打印输出结构体变量 book1 的所有成员。例如:
printf("ISBN: %d\n", pBook->isbn); printf("Author: %s\n", pBook->author); printf("Price: %.2f\n", pBook->price);
编译运行程序,结果如下:
ISBN: 12345678 Author: JiaBaoYu Price: 78.50
可见,结果和之前是完全一致的。
要注意的是,箭头运算符只适用于指向结构体变量的指针,如果面对的是结构体变量本身,还是应该使用点运算符。
最后要说明的就是,不仅可以获取一个结构体变量的内存地址,还可以获取到结构体变量的各个成员的内存地址,即获得指向结构体变量中某个成员的指针。例如:
由于成员访问运算符的优先级高于取地址运算符,因此,表达式“&book1.isbn”的求值顺序为:先通过成员访问运算符访问到 book1 的成员 isbn,再通过取地址运算符获取该成员的内存地址。
pIsbn 为 int 类型的指针变量,我们将结构体变量 book1 的成员 isbn 的内存地址初始化给 pIsbn。pPrice 为 float 类型的指针变量,我们将结构体变量 book1 的成员 price 的内存地址初始化给 pPrice。需要注意的是,结构体变量 book1 的成员 author 本身是一个字符数组,其数组名就代表首字符的内存地址。因此,我们就直接将其初始化给 char 类型的指针变量 pAuthor。千万不要在前面再使用取地址运算符了,否则,得到的就不再是 char 类型的指针,而是 char [20]类型的指针,即得到了一个数组指针。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论