C语言结构指针

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C语言结构指针

这篇文章是九九年写的,这篇文章适合中级程序员。有不明白之处不要紧,多看几遍,然后花些时间上机操作及认真思考每个问题。遇到难题要研究、解决,难题出现于哪里?该用什么方式来解决?为什么要选择这个方式解决?有其它的解决方法吗?这样的解决方案完美吗?其实做个程序员这些基本的思考心得是要掌握的。记住;遇问题不要逃避,要面对现实、勇于挑战,仔细研究难题的所在,这样相信你会成功的!

指针结构与指针的关系亦有两重:其一是在定义结构时,将指针作为结构中的一个成员;其二是指向结构的指针(称为结构指针)。前者同一般的结构成员一样可直接进行访问,后者是本节讨论的重点。

结构指针说明的一般形式是:

struct 结构类型名称* 结构指针变量名;

例如:struct date * pdate, today;

说明了两个变量,一个是指向结构date的结构指针pdate,today是一个date结构变量。语句:

pdate = &today;

pdate today (struct date)

year

month

day

通过结构变量today访问其成员的操作,也可以用等价的指针形式表示:

today.year = 2001;等价于(*pdate).year = 2001;

由于运算符"*"的优先级比运算符"."的优先级低,所以必须有"( )"将*pdate括起来。若省去括号,则含义就变成了"*(pdate.year)"。

在C语言中,通过结构指针访问成员可以采用运算符"->"进行操作,对于指向结

构的指针,为了访问其成员可以采用下列语句形式:

结构指针->成员名;

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

pdate->year = 2001;

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

结构指针是指向一种结构类型的指针变量,它是结构在内存中的首地址,结构指针具有一般指针的特性,如在一定条件下两个指针可以进行比较,也可以与整数进行加减。但在指针操作时应注意:进行地址运算时的放大因子由所指向的结构的实际大小决定。

例11-7:用结构指针改写加密程序。

#include "stdio.h"

struct table

{ char input, output;

} ;

struct table translate[ ]=

{ 'a', 'd', 'b', 'w', 'c', 'k', 'd', ';' , 'e', 'i',

'i', 'a', 'k', 'b', ';', 'c', 'w', 'e'

}; /* 建立加密对照表*/

main( )

{ char ch;

struct table *p, *pend; /* p和pend为指向结构table的指针*/

pend = & translate[ sizeof(translate)/sizeof(struct table)-1 ];

/* pend指向结构数组translate的最后一个元素*/

while ( (ch=getchar( )) != '\n')

{ for ( p=translate ; p->input!=ch && p!=pend; p++ ) ;

if ( p->input==ch )

putchar( p->output);

else

putchar (ch);

}

}

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

由于结构指针和在结构中将指针作为成员,使得对于结构变量的运算和对成员的操作变得较为复杂。由于取内容的"*"与"."和"->"运算符的优先级与结合性不同,使得对成员的访问和操作又增加了一层难度,再因为"++"和"--"运算所具有的"先操作"与"后操作"的特性,以及"++"和"--"运算的结合性,使得"++"和--"运算与结构操作混合在一起时,实际操作会更为复杂。

例11-8:请分析程序的运算结果。

#include "stdio.h"

struct s

{ int x, *y; /* y: 结构中的成员是指向整型的指针*/

} *p; /* p: 指向结构的指针*/

int data[5]={10, 20, 30, 40, 50,}; /* data: 整型数组*/

struct s array[5]=

{ 100, &data[0], 200, &data[1], 300, &data[2],

400, &data[3], 500, &data[4]

}; /* array: 结构数组*/

main ( )

{ p=array; /* 指针p指向结构数组的首地址*/

printf ("For printer:\n");

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

printf ("%d\n", (*p).x);

printf ("%d\n", *p->y);

printf ("%d\n", *(*p).y);

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

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

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

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

printf ("%d\n", ++ (*p->y));

printf ("%d\n", ++ * p->y);

printf ("%d\n", * ++ p->y);

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

printf ("%d\n", * (++p)->y);

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

printf ("%d\n", * p->y ++);

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

printf ("%d\n", * (p->y) ++);

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

printf ("%d\n", * p ++ ->y);

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

}

结构数组array的初始化后的状态如图11.4所示。程序中指针操作的含义如下:

p->x /* 取结构指针p指向的结构的成员x的值,输出100 */

(*p).x /* 取结构指针p的内容的成员x的值,功能同上,输出100 */

*p->y /* 取结构指针p的指针成员y的内容,输出10 */

*(*p).y /* 取结构指针p的内容的指针成员y的内容,功能同上,输出10 */

++p->x /* p所指的x加1,x先加1后再输出101 ,p不加1 */

(++p)->x /* p先加1后再取x的值,x不加1,输出200 */

p->x++ /* 先取x的值后x再加1,输出200 */

p->x /* 输出201 */

++(*p->y) /* p所指的y的内容先加1,输出21 ,p不加1,y也不加1 */

相关文档
最新文档