打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
结构类型的指针

§6.3 结构类型的指针

像其他指针对象一样,C同样允许指针指向结构体,并通过指向结构体的指针引用结构的成员。

6.3.1 结构指针的定义

   和其他指针的定义类似的是,结构指针也是通过在结构变量名前面加星号“*”来定义。

例如:

struct date{

       int year;

       int month;

       int day;

};

struct date *pd;

或者

struct date{

       int year;

       int month;

       int day;

}*pd;

要使得结构指针指向struct date类型的结构变量,可以通过赋值的方法。如:

struct date workday;

pd=&workday;

要注意的是,这里赋给pd的初值是&workday。对于结构变量workday来说,&workday&workday.year取值完全相同,但是二者类型是不同,&workday类型是struct date *,而&workday.yearint *类型的。

当然也可以在定义的同时初始化结构指针。如:

struct date{

       int year;

       int month;

       int day;

}workday,*pd=&workday;

6.3.2 通过结构的指针引用结构的成员

通过结构的指针引用结构的成员有两种方法,一种是通过间接访问算符“*”;另一种是通过成员选择运算符。

1  使用间接访问算符“*”引用结构成员

基本引用形式是:

*结构的指针)·成员名

例如:

struct date weekday,*p=&weekday;

则通过结构的指针引用结构成员的表示形式如下所示

(*p).year       /*等同于weekday.year*/

(*p).month     /*等同于weekday.mongth*/

(*p).day       /*等同于weekday.day*/

由于”·”运算符的优先级别高于“*”,所以圆括号不可少。注意不要把(*p).year写成*p.year,二者是不同的,*p.year等同于*(p.year),表示结构变量p的成员year是一个指针,而*(p.year)表示引用该成员指向的对象。可见*p.year是非法表示。

2  使用成员选择运算符“->

C语言中为了使用方便和直观,用成员选择运算符“->”简化结构成员的指针引用形式,成员选择运算符又称为箭头操作符(arrow operator),由减号和大于好拼接而成。使用成员选择运算符引用结构成员的形式为:

结构的指针->成员名

例如:

struct date d,*p=&d;

则以下同一行的三个表达式是等价的。

       p->year           (*p).year                d.year

p->month         (*p).month              d.month

p->day            (*p).day                d.day

例如:

struct  stud{

char  name[10];

long  num;

struct date  birth_date;

char sex;

}s,*ps=&s;

s是嵌套的结构变量,p是指向s的指针。则以下是引用同一个成员的四个等价的表达式:

s.birth_date.year        *ps.birth_date.year

ps->birth_date.year        (ps->birth_date).year

成员选择运算符“->”的优先级别和结合性与“.”相同。

例如有如下变量定义:

struct {

       int num;

       char *name;

}s={1,”abcdefg”},*p=&s;

分析以下表达式的结果:

表达式                  表达式结果                  说明

p->num++                    1                          先访问s.len,再把s.len1

++p->num                    2                          s.len1值变为2,后访问s.len

p->name                s.name                       表示字符串”abcdefg”

*p->name                     ‘a’                        访问s.name指向的对象,即字符’a’

*p->name++                 ‘a’                     访问s.name指向的对象即字符’a’,然后使

    p->names.name指向下一个字符’b’

(*p->name)++                     ‘a’             先访问p->name指向的对象即字符’a’,然                    
                                        
后使*p->name1

6.2  分析下面程序的运行结果

#include <stdio.h>

void main(void)

{     struct {

              int x;

              int y;

       }a[2]={{1,2},{3,4}},*p=s;

       printf(“%d,”,++p->x);

       printf(%d\n”,(++p)->x);

}

程序中定义结构指针p,初值指向结构数组a 。第一个输出函数要求输出表达式++p->x的值,按照运算符的优先级别,运算符“->”优先级别高于“++”。表达式++p->x等价与++(p->x),则表达式结果为2

第二个输出函数中输出表达式(++p)->x的结果。表达式(++p)->x由于有括号,先执行++p指向s[1];再取成员x的值。所以该表达式结果为3,表达式执行完后,指针变量p指向s[1]

结构的指针最常见用在函数的参数和处理动态数据结构中,这些内容在后续内容中做详细介绍。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
-> 在c语言中是什么意思
C语言中的.与->区别
学习C++这一篇就够了基础篇
3.5 数据结构 (Data Structures)
C语言优先级顺口溜
把C 的源程序改写成C语言,方法是这样滴!
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服