對C語言 結構陣列 指向結構變數的指標 指向結構陣列的指標
一、結構陣列的定義
陣列的元素可以是結構型別的。結構陣列的每一個元素都是具有相同的結構型別的下標結構變數。在實際應用中,經常用結構陣列來表示具有相同資料結構的一個群體。
如:一個班的學生的檔案,一個車間職工的工資等。
struct stu
{
Int num;
char *name;
char sex[20];
float score;
}boy[5];
定義了一個結構陣列boy,共有5個元素,boy[0]~boy[4].每個陣列元素都有struct stu的結構形式。對陣列結構可以做初始化賦值。
#include<stdio.h> struct stu { int num; char *name; char sex; float score; }boy[5] = { {101,"shi",'w',46}, {102,"wen",'m',76}, {103,"jie",'w',89.8}, {104,"jier",'m',25}, {105,"dada",'w',65}, }; int main(int argc,char **argv) { int i; int c=0; float ave; float s = 0; for(i=0;i<5;i++) { s += boy[i].score; if (boy[i].score < 60) { c+=1; } printf("num=%d,name=%s,sex=%c,score=%2.f\n",boy[i].num,boy[i].name,boy[i].sex,boy[i].score); } printf("s=%f\n",s); ave = s/5; printf("ave=%f\ncount=%d\n",ave,c); return 0; }
本例程式中定義了一個外部結構陣列boy,總共5個元素,並做了初始化賦值。在main函式中用for語句逐漸累加各個元素的score,成員值存於s之中,如score的值小於60(不及格)即計數器C加1,迴圈完畢後計算平均成績,並輸出全班總分,平均分以及不及格人數。
二、指向結構變數的指標
一個指標變數當用來指向一個結構變數時,稱之為結構指標變數。結構指標變數的值指向的是結構變數的首地址。
通過結構指標即可訪問該結構變數。
結構指標變數的說明一般的格式為:
Struct stu *pstu;
訪問的一般形式為:
結構指標變數->成員名
例如:(*pstu).num;
或者是:
Pstu->num;
/*
結構指標變數的具體說明和使用方法
*/
/*
本例程式中定義了一個結構體stu,定義了型別結構變數boy1並做了初始化賦值,還定義了一個指向stu型別結構的指標變數pstu。在main函式中,pstu被賦予boy1的地址,因此pstu指向boy1,。然後在printf語句中用三種形式的輸出boy1的各個成員值。
從運算結果可以看出:
結構變數.成員名
(*結構指標變數).成員名
結構指標變數->成員名
*/
#include<stdio.h> struct stu { int num; char name[20]; char sex; float score; }boy1 = {102,"shi wen jie",'w',48},*pstu; int main(int argc,char **argv) { pstu = &boy1; printf("num=%d\t,name=%s\t,sex=%c\t,score=%f\n",boy1.num,boy1.name,boy1.sex,boy1.score); printf("num=%d\t,name=%s\t,sex=%c\t,score=%f\n",(*pstu).num,(*pstu).name,(*pstu).sex,(*pstu).score); printf("num=%d\t,name=%s\t,sex=%c\t,score=%f\n",pstu->num,pstu->name,pstu->sex,pstu->score); return 0; }
三、指向結構陣列的指標
指標變數可以指向一個結構陣列,這時結構指標變數的值是整個結構陣列的首地址。結構指標變數也可以指向結構陣列的一個元素,這時的結構指標變數的值是該結構陣列元素的首地址。
***ps為指向結構陣列的指標變數,則ps也是指向該結構陣列的0號元素,ps+1指向1號元素,ps+i則指向i號元素。
/*
在程式中定義了stu結構型別的外部陣列boy並做了初始化賦值。在main中定義了ps為指向stu型別的指標。在迴圈語句for的表示式1中,ps被賦予boy的首地址,然後迴圈5次,輸出boy中陣列中的成員值。
*/
/*
用指標變數輸出結構陣列
*/
#include<stdio.h>
struct stu
{
int num;
char name[8];
char sex;
float score;
}boy[5] = {
{101,"shi",'w',65},
{102,"wen",'m',89},
{103,"jie",'w',86},
{104,"jie jie",'m',70},
{105,"hi",'m',76},
};
int main(int argc,char **argv)
{
struct stu *ps;
printf("num\tname\tsex\tscore\n");
for(ps=boy;ps<boy+5;ps++)
{
printf("%d\t%s\t%c\t%f\n",ps->num,ps->name,ps->sex,ps->score);
}
return 0;
}
***可以看出 結構指標變數可以訪問結構變數或結構陣列元素的成員,但是不能使他指向一個成員。也就是說,不允許取一個成員的地址來賦予它。
錯誤的:ps = &boy[1].sex;
正確的:ps = boy;(賦予陣列首地址) ps = &boy[0];(賦予0號元素首地址)