(C)struct结构体指针

结构体指针

  指针结构与指针的关系亦有两重:其一是在定义结构时,将指针作为结构中的一个成员;其二是指向结构的指针(称为结构指针)。

前者同一般的结构成员一样可直接进行访问,后者是本节讨论的重点。

结构指针说明的一般形式是:
      struct (结构类型名称) * (结构指针变量名);
例如:struct date * pdate, today;
说明了两个变量,一个是指向结构date的结构指针pdate,today是一个date结构变量。

语句:

struct date{

      int year;

      int month;

      int day;

      };
pdate = &today;
  

  通过结构变量today访问其成员的操作,也可以用等价的指针形式表示:
      today.year = 2001;  等价于  (*pdate).year = 2001;
由于运算符"*"的优先级比运算符"."的优先级低,所以必须有"( )"将*pdate括起来。若省去括号,则含义就变成了"*(pdate.year)"。

在C语言中,通过结构指针访问成员可以采用运算符"->"进行操作,对于指向结构的指针,为了访问其成员可以采用下列语句形式:

      结构指针->成员名;

这样,上面通过结构指针pdate访问成员year的操作就可以写成:

      pdate->year = 2001;

如果结构指针p指向一个结构数组,那么对指针p的操作就等价于对数组下标的操作。

  结构指针是指向一种结构类型的指针变量,它是结构体在内存中的首地址。

结构指针具有一般指针的特性,如在一定条件下两个指针可以进行比较,也可以与整数进行加减。

但在指针操作时应注意:进行地址运算时的放大因子由所指向的结构的实际大小决定。

例1:用结构指针改写加密程序。

#include "stdio.h"


struct table{
                char input;
                char output;
            };

/* 建立加密对照表 */
struct table translate[ ]={ 'a', 'd', 'b', 'w', 'c', 'k', 'd', ';' , 'e', 'i',
                             'i', 'a', 'k', 'b', ';', 'c', 'w', 'e'
                        };
/*主函数*/
main( )
{ 
    char ch;
    /* p和pend为指向结构table的指针 */
    struct table *p;
    struct table *pend; 
    /* pend指向结构数组translate的最后一个元素 */
    pend = & translate[ sizeof(translate)/sizeof(struct table)-1 ];

    while ((ch=getchar( )) != '/n')
    { 
        for (p=translate ; p->input!=ch && p!=pend; p++);
        if (p->input == ch)
                putchar(p->output);
        else
                putchar(ch);
    }
}

 

读者可以将两个程序对照阅读,体会结构指针特点。程序中用pend指向数组的最后一个元素。

由于结构指针和在结构中将指针作为成员,使得对于结构变量的运算和对成员的操作变得较为复杂。

由于取内容的"*"与"."和"->"运算符的优先级与结合性不同,使得对成员的访问和操作又增加了一层难度,

再因为"++"和"--"运算所具有的"先操作"与"后操作"的特性,

以及"++"和"--"运算的结合性,使得"++"和--"运算与结构操作混合在一起时,实际操作会更为复杂。

 

posted @ 2016-07-23 22:52  跑马灯的忧伤  阅读(10783)  评论(0编辑  收藏  举报