结构体是自定义的数据类型,需要先声明结构体类型(模板),然后才能申明结构体变量。下面给出一种常用的结构体模板声明方式:
struct book { // struct 是关键字 book 自定义的结构体名
char name[MAXL]; // 结构体成员
double price;
} ; //结构体模板声明结束
struct book lib, *plib, library[N] ; // 声明结构体变量、结构体指针、结构体数组
使用结构体要注意:
1、结构体变量名不是地址
plib = &lib; // 用&操作符取结构体变量的地址
2、字符串成员尽量使用数组,用指针要注意初始化
struct pbook { //指针成员模板
char *pname; // 结构体中只存储了字符串的地址
double price;
} plib;
plib = { " C Primer Plus ", 105.5 }; // 常量字符串 C Primer Plus 存储在数据区,pname存储它的首地址
但如果读入字符串变量,由于pname没初始化,可能产生未知的错误。一个解决办法是,定义一个临时数组接收输入的变量,根据需要为pname动态分配地址,再拷贝数组到指针变量。
#include<stdio.h> #include<stdlib.h> #include<string.h> #define MAXL 80 // struct pbook { char *pname; double price; }; int main() { struct pbook lib; char temp[MAXL]; //临时保存书名 gets(temp); //根据书名长度分配存储空间 lib.pname=(char*)malloc(strlen(temp)+1); strcpy(lib.pname,temp); scanf("%lf",&lib.price); printf("%s %.2f",lib.pname,lib.price); free(lib.pname); return 0; }