指針變量可以指向一個結構數組,這時結構指針變量的值是整個結構數組的首地址。
結構指針變量也可指向結構數組的一個元素,這時結構指針變量的值是該結構數組元素的首地址。
設ps為指向結構數組的指針變量,則ps也指向該結構數組的0號元素,ps+1指向1號元素,ps+i則指向i號元素。
這與普通數組的情況是一致的。
【例11.6】用指針變量輸出結構數組。
struct stu { int num; char *name; char sex; float score; }boy[5]={ {101,"Zhou ping",'M',45}, {102,"Zhang ping",'M',62.5}, {103,"Liou fang",'F',92.5}, {104,"Cheng ling",'F',87}, {105,"Wang ming",'M',58}, }; main() { struct stu *ps; printf("No\tName\t\t\tSex\tScore\t "); for(ps=boy;ps<boy+5;ps++) printf("%d\t%s\t\t%c\t%f\t ",ps->num,ps->name,ps->sex,ps->score); }
在程序中,定義了stu結構類型的外部數組boy並作了初始化賦值。
在main函數內定義ps為指向stu類型的指針。
在循環語句for的表達式1中,ps被賦予boy的首地址,然后循環5次,輸出boy數組中各成員值。
應該注意的是,一個結構指針變量雖然可以用來訪問結構變量或結構數組元素的成員,
但是,不能使它指向一個成員。
也就是說不允許取一個成員的地址來賦予它。因此,下面的賦值是錯誤的。
ps=&boy[1].sex;
而只能是:ps=boy;(賦予數組首地址)
或者是:ps=&boy[0];(賦予0號元素首地址)
#include <stdio.h> struct student { int num; char name[20]; char sex; int age; };
/*指向結構體類型的數組的初始化*/ struct student stu[3]={
{10101,"Li Lin",'M',18},
{10102,"Zhang Fun",'M',19}, {10104,"Wang Min",'F',20}};
void main() { struct student *p;/*指向結構體類型的指針變量*/ printf("NO Name Sex Age\n"); for(p=stu;p<stu+3;p++)/*循環地址*/ { /* printf("%5d%-20s %2c %4d\n",p->num,p->name,p->sex,p->age); 等價於*/ printf("%5d%-20s %2c %4d\n",(*p).num,(*p).name,(*p).sex,(*p).age); } system("pause"); }
#include <stdio.h> #include <iostream> #include<math.h> using namespace std; int main() { //定義結構類型 struct human { char name[10]; int sex; int age; }; //聲明結構數組和結構指針變量,並初始化 human x[]={
{"WeiPing",1,30},
{"LiHua",1,25},
{"LiuMin",0,23}},*p=NULL; //用下標變量的輸出結構數組的元素 for (int i=0;i<3;i++) { cout<<x[i].name<<‘\t‘; cout<<x[i].sex<<‘\t‘; cout<<x[i].age<<endl; } cout<<"----------------"<<endl; //用結構指針輸出結構數組的元素 for (p=x;p<=&x[2];p++) { cout<<p->name<<‘\t‘; cout<<p->sex<<‘\t‘; cout<<p->age<<endl; } system("pause"); }
