C 语言提供了一些非常基本的数据类型,如 int、float、double、char 等,这些不同的类型决定了一个变量在内存中应该占据的空间以及表现形式。
但有时候面对的问题可能比较复杂,并不是这些基本的数据类型就可以解决的。
这时候可能会想到数组,数组允许将多个数据存放到一块。但有一个问题,数组要求每一个构成元素的类型是一样的。这里图书名称、图书作者和出版社可以用字符数组来存储,但图书售价应该用浮点型,出版日期是由整型数字构成吗,ISBN(国际标准书号)通常由 10 位或 13 位数字组成,可以用 long long 类型的变量来存放。
那么为了应对这种情况,C 语言就弄出了个结构体,来自定义所需要用的类型。
struct 结构体名称
{
结构体成员1;
结构体成员2;
结构体成员3;
......
结构体成员n;
};
struct Book
{
char title[128]; //图书名称
char author[40]; //图书作者
float price; //图书价格
unsigned int date; //出版日期
char publisher[40]; //出版社
}; //分号不能丢
struct 结构体名称 结构体变量名;
使用结构体类型定义局部变量
#include
struct Book
{
char title[128]; //图书名称
char author[40]; //图书作者
float price; //图书价格
unsigned int date; //出版日期
char publisher[40]; //出版社
};
int main()
{
struct Book book;
//book 是使用 struct Book 结构体类型创建的结构体变量
return 0;
}
使用结构体类型定义全局变量
#include
struct Book
{
char title[128]; //图书名称
char author[40]; //图书作者
float price; //图书价格
unsigned int date; //出版日期
char publisher[40]; //出版社
}book1; //在声明结构体的时候就把 book 变量创建出来
struct Book book2;
int main()
{
......
return 0;
}
声明和定义的区别
int a = 10;
int arr[] = {1,2,3,4,5};
struct Book book = {"《C primer plus》","史蒂芬·普拉达",108,20160401,"人民邮电出版社"};
举个栗子
#include
struct Book
{
char title[128];
char author[40];
float price;
unsigned int date;
char publisher[40];
};
int main()
{
struct Book book = { "《C primer plus》",
"史蒂芬·普拉达",
108,
20160401,
"人民邮电出版社"
};
printf("书名:%s\n", book.title);
printf("作者:%s\n", book.author);
printf("价格:%.2f\n", book.price);
printf("出版日期:%u\n", book.date);
printf("出版社:%s\n", book.publisher);
return 0;
}
定义结构体指针
struct Book book;
struct Book* p = &book;
指针访问结构体成员
#include
struct Book
{
char title[128];
char author[40];
float price;
unsigned int date;
char publisher[40];
};
int main()
{
struct Book book = { "《C primer plus》",
"史蒂芬·普拉达",
108,
20160401,
"人民邮电出版社"
};
struct Book* p = &book;
printf("书名:%s\n", p->title);
printf("作者:%s\n", p->author);
printf("价格:%.2f\n", p->price);
printf("出版日期:%u\n", p->date);
printf("出版社:%s\n", p->publisher);
return 0;
}
举个栗子
struct Date
{
int year;
int month;
int day;
};
struct Book
{
char title[128];
char author[40];
float price;
struct Date date;
char publisher[40];
};
int main()
{
struct Book book = {"《C primer plus》",
"史蒂芬·普拉达",
108,
{2016,04,01},
"人民邮电出版社"
};
return 0;
}
......
int main()
{
printf("书名:%s\n", book.title);
printf("作者:%s\n", book.author);
printf("价格:%.2f\n", book.price);
printf("出版日期:%d-%d-%d\n", book.date.year,
book.date.month,book.date.day);
printf("出版社:%s\n", book.publisher);
return 0;
}
先说结论
举个栗子
#include
struct Book
{
char title[128];
char author[40];
float price;
unsigned int date;
char publisher[40];
};
void print1(struct Book book)
{
printf("-----传结构体变量-----\n");
printf("书名:%s\n", book.title);
printf("作者:%s\n", book.author);
printf("价格:%.2f\n", book.price);
printf("出版日期:%u\n", book.date);
printf("出版社:%s\n",book.publisher);
printf("----------------------\n");
}
void print2(struct Book* p)
{
printf("\n-----传结构体地址-----\n");
printf("书名:%s\n", p->title);
printf("作者:%s\n", p->author);
printf("价格:%.2f\n", p->price);
printf("出版日期:%u\n", p->date);
printf("出版社:%s\n", p->publisher);
printf("----------------------\n");
}
int main()
{
struct Book book = { "《C primer plus》",
"史蒂芬·普拉达",
108,
20160401,
"人民邮电出版社"
};
print1(book); //传结构体变量
print2(&book);//传结构体地址
return 0;
}
上面的 print1 和 print2 哪种更好?