指针变量可以指向一个结构数组,这时结构指针变量的值是整个结构数组的首地址。
结构指针变量也可指向结构数组的一个元素,这时结构指针变量的值是该结构数组元素的首地址。
设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 Name Sex Score "); for(ps=boy;ps<boy+5;ps++) printf("%d %s %c %f ",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 "); for(p=stu;p<stu+3;p++)/*循环地址*/ { /* printf("%5d%-20s %2c %4d ",p->num,p->name,p->sex,p->age); 等价于*/ printf("%5d%-20s %2c %4d ",(*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<<‘ ‘; cout<<x[i].sex<<‘ ‘; cout<<x[i].age<<endl; } cout<<"----------------"<<endl; //用结构指针输出结构数组的元素 for (p=x;p<=&x[2];p++) { cout<<p->name<<‘ ‘; cout<<p->sex<<‘ ‘; cout<<p->age<<endl; } system("pause"); }