分享

手把手教你C语言结构指针(推荐)

 山峰云绕 2018-09-10


     https://m./group/6599454111534416387/?iid=43625053414&app=news_article&timestamp=1536565762&group_id=6599454111534416387


今天小编给大家带来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的操作就等价于对数组下标的操作。

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


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

#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指向数组的最后一个元素。由于结构指针和在结构中将指针作为成员,使得对于结构变量的运算和对成员的操作变得较为复杂。由于取内容的'*'与'.'和'->'运算符的优先级与结合性不同,使得对成员的访问和操作又增加了一层难度,再因为'++'和'--'运算所具有的'先操作'与'后操作'的特性,以及'++'和'--'运算的结合性,使得'++'和--'运算与结构操作混合在一起时,实际操作会更为复杂。例2:请分析程序的运算结果。#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 */++ *p->y /* 同上,由运算的结合性隐含了括号,输出 22 */* ++p->y /* y先加1后再取y的内容,输出30,p不加1,y的内容不加1 */p->x /* 输出 201 */*(++p)->y /* p先加1后取所指y的内容,输出 30 */p->x /* 输出 300 */*p->y ++ /* 取p所指的y的内容,输出 30,然后p所指的y加1 */p->x /* 输出 300 */*(p->y)++ /* 取p所指的y的内容,输出 40,然后p所指的y加1 */p->x /* 输出 300 */*p++->y /* 取p所指的y的内容,输出 50,然后p加1 */p->x /* 输出 400 */


例3:可用一个结构表示学生的学号和成绩,编写程序,对班中30名学生按成绩进行排序,并输出排序后的学号、成绩和全班平均分。#include #define STNUM 30 /* 全班同学人数 */struct stuinf{ int stid; /* 学生学号 */int score; /* 学生成绩 */} stu[STNUM]; /* stu: 结构数组 */main ( ){ struct stuinf *ptemp, /* ptemp:指向结构的指针, 临时变量 */*p[STNUM]; /* p:指向结构的指针构成的指针数组 */int i, j, k, sum=0; /* i,j,k:临时变量;sum:分数累计 */for (i=0; i<=stnum-1; i++)="" 输入学生的学号和成绩="" */{="" scanf="" ('%d%d',="" &stu[i].stid,="" &stu[i].score);="" 输入学生的学号和成绩="" */p[i]="&stu[i];/*" 指针数组p[i]的第i个指针(元素)指向结构数组的第i个元素="" */sum="" +="stu[i].score;" 累计学生的分数="" */}for="" (="" i="0;"><=stnum-2; i++="" )="" 排序操作="" */{="" k="i;" k:在第i次循环中,指向当前最高分的指针在指针数组p中的下标="" */for="" (j="i;"><=stnum-1; j++)if="" (p[k]-="">score < p[j]-="">score) k=j;/* 查找当前最大值, k中存放最大值对应的指针在指针数组p中的下标 */if ( k!=i ) /* 当k不等于i时,交换两个指向结构的指针 */{ ptemp = p[i];p[i] = p[k];p[k] = ptemp;}}for (i=0; i<=stnum-1; i++)="" 按排序顺序输出学号和成绩="" */printf('%d,%d/n',="" (*p[i]).stid,="" p[i]-="">score);printf ('average score = %d/n', sum/STNUM); /* 输出平均分 */} 程序中使用了较为复杂的数据结构,包括:结构数组stu,指向结构的指针ptemp,由指向结构的指针构成的指针数组p。程序在结构数组stu和指针数组p之间建立了对应的指针关系,从而为简化后续处理打下了良好的基础。在排序过程中,程序使用选择排序的思想,先查找确定当前的最大值,再进行一次有实效的数据交换。进行数据交换时,也没有交换结构数据本身,而是交换了指向结构数据的指针。在输出时,按照排序后指针的顺序,输出排序后的数据。

写在最后

喜欢此篇文章或觉得这篇文章对你有帮助的读者可以点播关注或者转发,私信小编001即可获得小编自己整理的一份2018最新的C/C++资料和0基础入门教程,欢迎初学和进阶中的小伙伴

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多