struct stu { int num; char *name; char sex; float score; }boy[5]; |
struct stu { int num; char *name; char sex; float score; }boy[5]={ {101,\"li ping\",\"m\",45}, {102,\"zhang ping\",\"m\",62.5}, {103,\"he fang\",\"f\",92.5}, {104,\"cheng ling\",\"f\",87}, {105,\"wang ming\",\"m\",58}; } |
struct stu { int num; char *name; char sex; float score; }boy[5]={ {101,\"li ping\",\'m\',45}, {102,\"zhang ping\",\'m\',62.5}, {103,\"he fang\",\'f\',92.5}, {104,\"cheng ling\",\'f\',87}, {105,\"wang ming\",\'m\',58}, }; main() { int i,c=0; float ave,s=0; for(i=0;i<5;i++) { s+=boy[i].score; if(boy[i].score<60) c+=1; } printf(\"s=%f\\n\",s); ave=s/5; printf(\"average=%f\\ncount=%d\\n\",ave,c); } |
#include\"stdio.h\" #define num 3 struct mem { char name[20]; char phone[10]; }; main() { struct mem man[num]; int i; for(i=0;i<num;i++) { printf(\"input name:\\n\"); gets(man[i].name); printf(\"input phone:\\n\"); gets(man[i].phone); } printf(\"name\\t\\t\\tphone\\n\\n\"); for(i=0;i<num;i++) printf(\"%s\\t\\t\\t%s\\n\",man[i].name,man[i].phone); } |
本程序中定义了一个结构mem,它有两个成员name和phone 用来表示姓名和电话号码。在主函数中定义man为具有mem 类型的结构数组。在for语句中,用gets函数分别输入各个元素中两个成员的值。然后又在for语句中用printf语句输出各元素中两个成员值。
结构指针变量
结构指针变量的说明和使用一个指针变量当用来指向一个结构变量时, 称之为结构指针变量。
结构指针变量中的值是所指向的结构变量的首地址。 通过结构指针即可访问该结构变量, 这与数组指针和函数指针的情况是相同的。结构指针变量说明的一般形式为:
struct 结构名*结构指针变量名
例如,在前面的例7.1中定义了stu这个结构, 如要说明一个指向stu的指针变量pstu,可写为:
struct stu *pstu;
当然也可在定义stu结构时同时说明pstu。与前面讨论的各类指针变量相同,结构指针变量也必须要先赋值后才能使用。赋值是把结构变量的首地址赋予该指针变量, 不能把结构名赋予该指针变量。如果boy是被说明为stu类型的结构变量,则: pstu=&boy是正确的,而: pstu=&stu是错误的。
结构名和结构变量是两个不同的概念,不能混淆。 结构名只能表示一个结构形式,编译系统并不对它分配内存空间。 只有当某变量被说明为这种类型的结构时,才对该变量分配存储空间。 因此上面&stu这种写法是错误的,不可能去取一个结构名的首地址。 有了结构指针变量,就能更方便地访问结构变量的各个成员。
其访问的一般形式为: (*结构指针变量).成员名 或为:
结构指针变量->成员名
例如: (*pstu).num或者: pstu->num
应该注意(*pstu)两侧的括号不可少, 因为成员符“.”的优先级高于“*”。如去掉括号写作*pstu.num则等效于*(pstu.num),这样,意义就完全不对了。 下面通过例子来说明结构指针变量的具体说明和使用方法。
[例6]
struct stu { int num; char *name; char sex; float score; } boy1={102,\"zhang ping\",\'m\',78.5},*pstu; main() { pstu=&boy1; printf(\"number=%d\\nname=%s\\n\",boy1.num,boy1.name); printf(\"sex=%c\\nscore=%f\\n\\n\",boy1.sex,boy1.score); printf(\"number=%d\\nname=%s\\n\",(*pstu).num,(*pstu).name); printf(\"sex=%c\\nscore=%f\\n\\n\",(*pstu).sex,(*pstu).score); printf(\"number=%d\\nname=%s\\n\",pstu->num,pstu->name); printf(\"sex=%c\\nscore=%f\\n\\n\",pstu->sex,pstu->score); } |
本例程序定义了一个结构stu,定义了stu类型结构变量boy1 并作了初始化赋值,还定义了一个指向stu类型结构的指针变量pstu。在main函数中,pstu被赋予boy1的地址,因此pstu指向boy1 。然后在printf语句内用三种形式输出boy1的各个成员值。 从运行结果可以看出:
结构变量.成员名
(*结构指针变量).成员名
结构指针变量->成员名
这三种用于表示结构成员的形式是完全等效的。结构数组指针变量结构指针变量可以指向一个结构数组, 这时结构指针变量的值是整个结构数组的首地址。 结构指针变量也可指向结构数组的一个元素,这时结构指针变量的值是该结构数组元素的首地址。设ps为指向结构数组的指针变量,则ps也指向该结构数组的0号元素,ps+1指向1号元素,ps+i则指向i号元素。 这与普通数组的情况是一致的。
[例7.7]用指针变量输出结构数组。
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\\n\"); for(ps=boy;ps<boy+5;ps++) printf(\"%d\\t%s\\t\\t%c\\t%f\\t\\n\",ps->num,ps->name,ps->sex,ps->score); } |