🍏指向结构的指针
2021-1-25
| 2023-8-2
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
喜欢使用指针的人一定很高兴能使用指向结构的指针。至少有 4 个理由可以解释为何要使用指向结构的指针。
  • 第一,就像指向数组的指针比数组本身更容易操控(如,排序问题)一样,指向结构的指针通常比结构本身更容 易操控。
  • 第二,在一些早期的C实现中,结构不能作为参数传递给函数,但是可以传递指向结构的指针。
  • 第三,即使能传递一个结构,传递指针通常更有效率。
  • 第四,一些用于表示数据的结构中包含指向其他结构的指针。
notion image
 

声明和初始化结构指针

声明结构指针很简单:
首先是关键字 struct,其次是结构标记 guy,然后是一个星号(*),其后跟着指针名。这个语法和其他指针声明一样。
该声明并未创建一个新的结构,但是指针him现在可以指向任意现有的guy类型的结构。例如,如果barney是一个guy类型的结构,可以这样写:
和数组不同的是,结构名并不是结构的地址,因此要在结构名前面加上&运算符。
在本例中,fellow 是一个结构数组,这意味着 fellow[0]是一个结构。所以,要让 him 指向fellow[0],可以这样写:
 
输出的前两行说明赋值成功。比较这两行发现,him指向fellow[0],him1指向fellow[1]。注意,him加1相当于him指向的地址加84。在十六进制中,874 - 820 = 54(十六进制)= 84(十进制),因为每个guy结构都占用84字节的内存:names.first占用20字节,names.last占用20字节,favfood占用20字节,job占用20字节,income占用4字节(假设系统中float占用4字节)。 顺带一提,在有些系统中,一个结构的大小可能大于它各成员大小之和。这是因为系统对数据进行校准的过程中产生了一些“缝隙”。例如,有些系统必须把每个成员都放在偶数地址上,或4的倍数的地址上。在这种系统中,结构的内部就存在未使用的“缝隙”。
 

用指针访问成员

指针him指向结构变量fellow[0],如何通过him获得fellow[0]的成员的值?
第1种方法也是最常用的方法:使用->运算符。
如果him == &barney,那么him->income 即是 barney.income 如果him == &fellow[0],那么him->income 即是 fellow[0].income
换句话说,->运算符后面的结构指针和.运算符后面的结构名工作方式相同(不能写成him.incone,因为him不是结构名)。
 
第2种方法是,以这样的顺序指定结构成员的值:如果him ==&fellow[0],那么*him == fellow[0],因为&和*是一对互逆运算符。因此,可以做以下替代:
 
总之,如果him是指向guy类型结构barney的指针,下面的关系恒成立:
  • C
  • 嵌套结构向函数传递结构的信息
    目录