https://m.toutiaocdn.cn/group/6599454111534416387/?iid=43625053414&app=news_article×tamp=1536565762&group_id=6599454111534416387
今天小編給大家帶來(lái)C語(yǔ)言結構指針詳解,溫馨提示:亮點(diǎn)在最后!
有不明白之處不要緊,多看幾遍,然后花些時(shí)間上機操作及認真思考每個(gè)問(wèn)題。遇到難題要研究、解決,難題出現于哪里?該用什么方式來(lái)解決?為什么要選擇這個(gè)方式解決?有其它的解決方法嗎?這樣的解決方案完美嗎?其實(shí)做個(gè)程序員這些基本的思考心得是要掌握的。
記?。?/strong>遇問(wèn)題不要逃避,要面對現實(shí)、勇于挑戰,仔細研究難題的所在,這樣相信你會(huì )成功的!
指針結構與指針的關(guān)系亦有兩重:其一是在定義結構時(shí),將指針作為結構中的一個(gè)成員;其二是指向結構的指針(稱(chēng)為結構指針)。前者同一般的結構成員一樣可直接進(jìn)行訪(fǎng)問(wèn),后者是本節討論的重點(diǎn)。
結構指針說(shuō)明的一般形式是:
struct 結構類(lèi)型名稱(chēng) * 結構指針變量名;
例如:struct date * pdate, today;
說(shuō)明了兩個(gè)變量,一個(gè)是指向結構date的結構指針pdate,today是一個(gè)date結構變量。語(yǔ)句:
pdate = &today;
pdate today (struct date)
year
month
day
通過(guò)結構變量today訪(fǎng)問(wèn)其成員的操作,也可以用等價(jià)的指針形式表示:
today.year = 2001; 等價(jià)于 (*pdate).year = 2001;
由于運算符'*'的優(yōu)先級比運算符'.'的優(yōu)先級低,所以必須有'( )'將*pdate括起來(lái)。若省去括號,則含義就變成了'*(pdate.year)'。
在C語(yǔ)言中,通過(guò)結構指針訪(fǎng)問(wèn)成員可以采用運算符'->'進(jìn)行操作,對于指向結構的指針,為了訪(fǎng)問(wèn)其成員可以采用下列語(yǔ)句形式:
結構指針->成員名;
這樣,上面通過(guò)結構指針pdate訪(fǎng)問(wèn)成員year的操作就可以寫(xiě)成:
pdate->year = 2001;
如果結構指針p指向一個(gè)結構數組,那么對指針p的操作就等價(jià)于對數組下標的操作。
結構指針是指向一種結構類(lèi)型的指針變量,它是結構在內存中的首地址,結構指針具有一般指針的特性,如在一定條件下兩個(gè)指針可以進(jìn)行比較,也可以與整數進(jìn)行加減。但在指針操作時(shí)應注意:進(jìn)行地址運算時(shí)的放大因子由所指向的結構的實(shí)際大小決定。
例1:用結構指針改寫(xiě)加密程序。
#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的最后一個(gè)元素 */
while ( (ch=getchar( )) != '/n')
{ for ( p=translate ; p->input!=ch && p!=pend; p++ ) ;
if ( p->input==ch )
putchar( p->output);
else
putchar (ch);
}
}
讀者可以將兩個(gè)程序對照閱讀,體會(huì )結構指針特點(diǎn)。程序中用pend指向數組的最后一個(gè)元素。由于結構指針和在結構中將指針作為成員,使得對于結構變量的運算和對成員的操作變得較為復雜。由于取內容的'*'與'.'和'->'運算符的優(yōu)先級與結合性不同,使得對成員的訪(fǎng)問(wèn)和操作又增加了一層難度,再因為'++'和'--'運算所具有的'先操作'與'后操作'的特性,以及'++'和'--'運算的結合性,使得'++'和--'運算與結構操作混合在一起時(shí),實(shí)際操作會(huì )更為復雜。例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的初始化后的狀態(tài)如圖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:可用一個(gè)結構表示學(xué)生的學(xué)號和成績(jì),編寫(xiě)程序,對班中30名學(xué)生按成績(jì)進(jìn)行排序,并輸出排序后的學(xué)號、成績(jì)和全班平均分。#include#define STNUM 30 /* 全班同學(xué)人數 */struct stuinf{ int stid; /* 學(xué)生學(xué)號 */int score; /* 學(xué)生成績(jì) */} stu[STNUM]; /* stu: 結構數組 */main ( ){ struct stuinf *ptemp, /* ptemp:指向結構的指針, 臨時(shí)變量 */*p[STNUM]; /* p:指向結構的指針構成的指針數組 */int i, j, k, sum=0; /* i,j,k:臨時(shí)變量;sum:分數累計 */for (i=0; i<=stnum-1; i++)="" 輸入學(xué)生的學(xué)號和成績(jì)="" */{="" scanf="" ('%d%d',="" &stu[i].stid,="" &stu[i].score);="" 輸入學(xué)生的學(xué)號和成績(jì)="" */p[i]="&stu[i];/*" 指針數組p[i]的第i個(gè)指針(元素)指向結構數組的第i個(gè)元素="" */sum="" +="stu[i].score;" 累計學(xué)生的分數="" */}for="" (="" i="0;"><=stnum-2; i++="" )="" 排序操作="" */{="" k="i;" k:在第i次循環(huán)中,指向當前最高分的指針在指針數組p中的下標="" */for="" (j="i;"><=stnum-1; j++)if="" (p[k]-="">score < p[j]-="">score) k=j;/* 查找當前最大值, k中存放最大值對應的指針在指針數組p中的下標 */if ( k!=i ) /* 當k不等于i時(shí),交換兩個(gè)指向結構的指針 */{ ptemp = p[i];p[i] = p[k];p[k] = ptemp;}}for (i=0; i<=stnum-1; i++)="" 按排序順序輸出學(xué)號和成績(jì)="" */printf('%d,%d/n',="" (*p[i]).stid,="" p[i]-="">score);printf ('average score = %d/n', sum/STNUM); /* 輸出平均分 */} 程序中使用了較為復雜的數據結構,包括:結構數組stu,指向結構的指針ptemp,由指向結構的指針構成的指針數組p。程序在結構數組stu和指針數組p之間建立了對應的指針關(guān)系,從而為簡(jiǎn)化后續處理打下了良好的基礎。在排序過(guò)程中,程序使用選擇排序的思想,先查找確定當前的最大值,再進(jìn)行一次有實(shí)效的數據交換。進(jìn)行數據交換時(shí),也沒(méi)有交換結構數據本身,而是交換了指向結構數據的指針。在輸出時(shí),按照排序后指針的順序,輸出排序后的數據。
喜歡此篇文章或覺(jué)得這篇文章對你有幫助的讀者可以點(diǎn)播關(guān)注或者轉發(fā),私信小編001即可獲得小編自己整理的一份2018最新的C/C++資料和0基礎入門(mén)教程,歡迎初學(xué)和進(jìn)階中的小伙伴
聯(lián)系客服