指向结构体的指针
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
9.1.9 指向结构体的指针
1. 结构体指针变量声明的一般形式
与一般变量一样,可以使一个指针变量指向结构体,从而形成结构体指针变量。
其值是所指向的结构体变量的首地址。
通过结构体指针即可访问该结构体变量,这与数组指针和函数指针的情况是相同的。
结构体指针变量声明的一般形式为:
struct 结构名 *结构指针变量名;
对前面定义的结构体hero,可以使一个指针phero指向hero类型的某个变量:
struct hero *phero;
既然结构体指针变量也是一种结构体变量,当然可以使用其他的两种定义结构体变量的方式定义结构体指针变量。
具体定义方式此处不再叙述。
2. 为何需要结构体指针变量
之所以引入结构体指针变量,出于以下原因:
●更易于操作
类似于数组指针比数组更易于操作一样(如排序问题),结构体指针比结构体本身更加的易于操作。
●更强的通用性
一些早期的C语言实现不支持将结构体变量作为参数传递给函数,但是结构体指针变量却可以。
●丰富的数据表示
许多奇妙的数据表示,如文件指针,都包含指向结构体的指针。
3. 指针变量到底指向什么?
与前面讨论的各类指针变量相同,结构指针变量也必须要先赋值后才能使用。
赋值是把结构变量的首地址赋予该指针变量,不能把结构名赋予该指针变量。
例如,下面对结构体指针变量phero1的赋值是正确的:
*phero1=&wusong;//将变量wusong的首地址赋值给指针变量phero 但是下面的赋值是错误的:
*phero2=&hero; //错误!
前面笔者已经强调过,结构体名和结构体变量是两个不同的概念,不能混淆。
结构体名只能表示一个结构形式,编译系统并不为其分配内存空间。
只有当某变量被定义为这种类型的结构体时,才为该变量分配存储空间。
所以&wusong的形式是正确的,表示结构体变量wusong的首地址,而&hero的形式是错误的,因为系统没有为hero分配内存,也不存在hero 的首地址。
如图9.9所示:
图9.9 结构体指针变量的内存分配
4. 访问成员
与其他结构体变量一样,可以使用“.”运算符访问结构体指针变量的成员,其一般形
式为:
(*结构指针变量).成员名
例如,对前面定义的变量phero的成员number进行访问如下:
(*phero).number;
因为成员运算符“.”和指针运算符“*”是同一优先级的运算符,但其结合顺序是从右到左的,所以括号运算符()必不可少,即下面的形式是错误的:
*phero.number;
为了防止此类错误,C语言还提供了一种访问结构体成员的方法,就是使用成员指针运算符“->”,使用->运算符访问结构体成员的一般形式如下:
结构指针变量->成员名
例如,下面用这种方式访问结构体指针变量phero的成员name:
*phero=&linchong;
phero->name;
其等价于:
(*phero).name;
;。