C語言——結構體與指針引用&結構體數組與指針引用

最近在搞C語言基礎儲備,無意間發現在此方面的知識還有漏洞,於是上網查閱資料,看到了下面的正文內容,閱後感到思路清晰心情愉悅。所以就順手記錄了下來,以後要是又忘記可以再來看。當然最主要的還是分享給大家!~

////////////////////////////////////////////gap///////////////////////////////////////////////

與基本類型指針變量相似,結構體指針變量主要作用是存儲其結構體變量的地址或結構體數組的地址,通過間接方式操作對應的變量和數組。在C語言中規定,結構體指針變量可以參與的運算符如下:
++,--,+ ,* ,->,.,|,&,!
下面通過例題說明,如何引用結構體指針變量存儲結構體變量地址,以及如何通過結構體指針變量間接的引用結構體變量以及其成員變量。
例9-3 應用結構體指針變量,打印結構體成員變量的信息。
#include <stdio.h>
struct Point
{
double x; /*x座標*/
double y; /*y座標*/
double z; /*z座標*/
};
int main()
{
struct Point oPoint1={100,100,0};
struct Point oPoint2;
struct Point *pPoint; /*定義結構體指針變量*/
pPoint=& oPoint2;   /*結構體指針變量賦值*/
(*pPoint).x= oPoint1.x;
(*pPoint).y= oPoint1.y;
(*pPoint).z= oPoint1.z;
printf("oPoint2={%7.2f,%7.2f,%7.2f}",oPoint2.x, oPoint2.y, oPoint2.z);
return(0);
}
程序運行結果如下:
oPoint2={ 100.00,100.00,0.00}
其中表達式&oPoint2的作用是獲得結構體變量oPoint2的地址。表達式pPoint=&oPoint2的作用是將oPoint2的地址存儲在結構體指針變量pPoint中,因此pPoint存儲了oPoint2的地址。*pPoint代表指針變量pPoint中的內容,因此*pPoint 和oPoint2等價。
通過結構體指針變量獲得其結構體變量的成員變量的一般形式如下:
(*結構體指針變量). 成員變量
其中“結構體指針變量”爲結構體指針變量,“成員變量”爲結構體成員變量名稱,“.”爲取結構體成員變量的運算符。
另外C語言中引入了新的運算符“->”,通過結構體指針變量直接獲得結構體變量的成員變量,一般形式如下:
結構體指針變量-> 成員變量
其中“結構體指針變量”爲結構體指針變量,“成員變量”爲結構體成員變量名稱,“- >”爲運算符。
因此,例9-3中的部分代碼
……
(*pPoint).x= oPoint1.x;
(*pPoint).y= oPoint1.y;
(*pPoint).z= oPoint1.z;
……
等價於
……
pPoint->x= oPoint1.x;
pPoint->y= oPoint1.y;
pPoint->z= oPoint1.z;
……
下面介紹如何應用結構體指針變量存儲結構體數組的首地址,以及如何通過結構體指針變量獲得結構體數組的元素及其成員變量。
例9-4 應用結構體指針變量改寫例9-3,主要介紹修改部分Mutiline函數,其他部分略。
/*多邊形繪製函數,形式參數爲struct Point 類型指針變量pPoints */
void Mutiline(struct Point *pPoints)
{
int i;
struct Point *pOPoint; /*定義結構體指針變量*/
pOPoint=pPoints; /*存儲結構體數組的首地址*/
moveto(pPoints->x,pPoints->y) ; /*將繪圖點移動到第0個點*/
for( i=0; i<NPOINTS ; ++i )
{
lineto(pPoints->x, pPoints->y); /*從上一點向當前點繪製直線*/
pPoints++;
}
pPoints=pOPoint; /*指向結構體數組的首地址*/
lineto(pPoints->x,pPoints->y); /*封閉曲線*/
}
函數void Mutiline(struct Point *pPoints)的輸入參數爲struct Point指針變量pPoints。在主函數中調用形式爲Mutiline(oPoints),將struct Point類型數組oPoints的首地址信息拷貝給形式參數struct Point *pPoint,此時pPoint指向結構體數組oPoints的第一個元素,如圖所示。
主函數調用Mutiline的過程如下,首先將struct Point類型數組oPoints的首地址信息拷貝給形式參數struct Point *pPoint,等價於
pPoint= oPoints;
接下來,程序的控制權交給Mutiline函數,進入函數Mutiline。在程序進入函數Mutiline之後,pPoints 指向oPoints的首地址,跟蹤程序表明此時變量pPoints的當前值爲0X0F82。另外,由於數組第一個元素oPoints[0]的地址與數組的首地址相同。亦可以理解爲此時pPoints指向了數組元素oPoints[0]的地址,因此*pPoints與oPoints[0]等價,表達式pPoints->x可以訪問oPoints[0]的成員變量x,同樣表達式pPoints->y可以訪問oPoints[0]的成員變量y。執行pPoints++語句之後,pPoints的當前值爲0X 0F9A。
graphic

0X0F9A- 0X0F82=0X0018=24=sizeof(struct Point),24個字節正好爲struct Point的大小。
此時pPoints指向數組元素oPoints[1]的地址, 因此*pPoints與oPoints[1]的等價。依次類推,通過pPoints的加法運算可以訪問結構體數組oPoints中的所有元素。
因此要正確理解結構體指針變量的算術運算,pPoints++或pPoints= pPoints+1的作用不是簡單的地址值加1,而是當前的地址值加上結構體類型的大小。
結構體指針變量+1= 結構體指針變量+sizeof(struct 結構體)
例9-5 輸入10個同學的姓名、數學成績、英語成績和物理成績,確定總分最高的同學,並打印其姓名及其三門課程的成績。
#include "stdio.h"
struct Student /*定義結構體struct Student*/
{
char Name[20]; /*姓名*/
float Math; /*數學*/
float English; /*英語*/
float Physical; /*物理*/
};
void main()
{
/*定義struct Student類型結構體數組存儲所有同學的相關信息*/
struct Student oStudents[10]={{"",0,0,0}};
/*定義struct Student類型指針存儲總分最高的同學的地址信息*/
struct Student *pMaxStu;
struct Student *pStudent;
float fMaxScore,fTotal;
float fMath,fEnglish,fPhysical;
char szName[20];
printf("\nPlease input 10 students and there score\n");/*提示信息*/
printf("---------------------------- ------------\n");
printf("Name Math English Physical \n");
printf("---------------------------- ------------\n");
fMaxScore=0;
pMaxStu=oStudents;
for(pStudent=oStudents;pStudent<oStudents+10;pStudent++)
{
/*讀入當前同學的相關信息*/
scanf("%s %f %f %f",szName,&fMath,&fEnglish,&fPhysical);
strcpy(pStudent->Name,szName);
pStudent->Math=fMath;
pStudent->English=fEnglish;
pStudent->Physical=fPhysical;
fTotal=pStudent->Math+pStudent- >English+pStudent->Physical;
/*獲得當前最高分的同學*/
if(fMaxScore<fTotal)
{
pMaxStu=pStudent;
}
}
printf("---------------------------- ------------\n");
printf("%s,%f,%f,%f",
pMaxStu->Name,pMaxStu->Math,pMaxStu->English,pMaxStu- >Physical);
}
首先定義長度爲10的struct Student類型結構體數組用於存儲所有同學的相關信息,定義struct Student類型指針pMaxStu存儲最高總分同學的地址信息。定義struct Student類型指針oStudents指向結構體數組oStudents 。
循環語句
for(pStudent=oStudents;pStudent<oStudents+10;pStudent++)
中pStudent=oStudents的作用是令pStudent指向數組的第一個元素;循環條件是pStudent<oStudents+10,即循環10次。其中語句
pStudent->Math=fMath;
pStudent->English=fEnglish;
pStudent->Physical=fPhysical;
的作用是保存當前同學的相關信息。
發佈了29 篇原創文章 · 獲贊 5 · 訪問量 34萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章