Python 结构体
一、结构体声明
struct 结构体名称{
结构体成员1;
结构体成员2;
结构体成员3;
};
eg:
struct Book{
char title[128];
char author[40];
float price;
unsigned int date;
char publisher[40];
};
二、定义结构体类型变量
struct 结构体名称 结构体变量名
eg:struct Book book;
还可以在声明的时候直接定义
struct Book{
char title[128];
char author[40];
float price;
unsigned int date;
char publisher[40];
} book;//注意这里有一个分号
三、访问结构体变量
要访问结构体成员,我们需要引入一个新的运算符号 点号 . 运算符。比如 book.title 就是引用 book 结构体的 title 成员,它是一个字符数组;而 book.price 则是引用 book 结构体的 price 成员,它是一个浮点型的变量。
struct Book{
char title[128];
char author[40];
float price;
unsigned int date;
char publisher[40];
} book;//注意这里有一个分号
int main(){
//struct Book book;这里是定义结构体类型变量的另一种方式
printf("请输入书名:");
scanf("%s",book.title);
printf("请输入作者:");
scanf("%s",book.author);
printf("请输入售价:");
scanf("%f",&book.price);
printf("请输入出版日期:");
scanf("%d",&book.date);
printf("请输入出版社:");
scanf("%s",book.publisher);
printf("数据录入完毕!\n");
printf("书名:%s\n",book.title);
printf("作者:%s\n",book.author);
printf("售价:%.2f\n",book.price);
printf("出版日期:%d\n",book.date);
printf("出版社:%s\n",book.publisher);
return 0;
}
四、初始化结构体变量
初始化一个变量和数组:
int a = 520;
int arr[5] = {1,2,3,4,5}
初始化一个结构体变量:
struct Book book = {
"《带你学C带你飞》",
"小甲鱼",
48.8,
20171111,
"清华大学出版社"
};
五、初始结构体的指定原值
其语法和数组制定初始化元素类似,不过结构体指定初始化成员使用点号(.)运算符和成员名
比如我们可以让程序只初始化Book的price成员:
struct Book book = {.price = 48.8};
还可以不按结构体声明的成员顺序进行初始化:
struct Book book = {
.publisher = "清华大学出版社",
.price = 48.8,
.date = 20171111
}
六、算一算
int main(){
struct A{
char a;
int b;
char c;
} a = {'x',520,'0'};
printf("size of a = %d\n",sizeof(a));//size of a = 12
return 0;
}
//不应该是1+4+1=6吗?怎么会是12
//这是编译器对结构体的成员进行内存对齐后的结果。
//说白了,内存对齐就是让CPU可以更快的读取和处理数据的方式。
int main(){
struct A{
char a;
char c;
int b;
} a = {'x','0',520};
printf("size of a = %d\n",sizeof(a));//size of a = 8
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];
} book1 = {
"《带你学C带你飞》",
"小甲鱼",
48.8,
{2017,11,11},
"清华大学出版社"
};
int main(){
printf("书名:%s\n",book1.title);
printf("作者:%s\n",book1.author);
printf("售价:%.2f\n",book1.price);
printf("出版日期:%d-%d-%d\n",book1.date.year,book1.date.month,book1.date.day);
printf("出版社:%s\n",book1.publisher);
return 0;
}
八、结构体数组
第一种方法是在申明结构体的时候进行定义
struct 结构体名称{
结构体成员;
} 数组名[长度];
第二种方法是先申明一个结构体类型(比如上面Book),在用此类型定义一个结构体数组
struct 结构体名称{
结构体成员;
};
struct 结构体名称 数组名[长度];
初始化结构体数组:
struct Book{
char title[128];
char author[40];
float price;
unsigned int date;
char publisher[40];
};
struct Book book[3] = {
{"《零基础入门学习Python》","小甲鱼",49.5,20161111,"清华大学出版社"},
{"《零基础入门学习Scratch》","不二如是",49.9,2017101,"清华大学出版社"},
{"《带你学C带你飞》","小甲鱼",49.5,20171111,"清华大学出版社"}
}
九、结构体指针
指向结构体变量的指针叫做结构体指针。
struct Book *pt;
pt = &book;
通过结构体指针访问结构体成员又两种方法:
第一种:(*结构体指针).成员名
第二种:结构体指针->成员名
十、传递结构体变量
int main(){
struct Test{
int x;
int y;
} t1,t2;
t1.x = 3;
t1.y = 4;
t2 = t1;//两个结构体变量之间是可以相互赋值的,但是结构体类型必须一样
printf("t2.x=%d,t2.y=%d",t2.x,t2.y);
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];
};
struct Book getInput(struct Book book){
printf("请输入书名:");
scanf("%s",book.title);
printf("请输入作者:");
scanf("%s",book.author);
printf("请输入售价:");
scanf("%f",&book.price);
printf("请输入出版日期:");
scanf("%d-%d-%d",&book.date.year,&book.date.month,&book.date.day);
printf("请输入出版社:");
scanf("%s",book.publisher);
return book;
}
void printBook(struct Book book){
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);
}
int main(){
struct Book b1,b2;
printf("请输入第一本书的信息...\n");
b1 = getInput(b1);
printf("请输入第二本书的信息...\n");
b2 = getInput(b2);
printf("录入完毕,现在开始打印验证...\n\n");
printf("打印第一本书的信息...\n");
printBook(b1);
printf("\n\n");
printf("打印第二本书的信息...\n");
printBook(b2);
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];
};
void getInput(struct Book *book){
printf("请输入书名:");
scanf("%s",book->title);
printf("请输入作者:");
scanf("%s",book->author);
printf("请输入售价:");
scanf("%f",&book->price);
printf("请输入出版日期:");
scanf("%d-%d-%d",&book->date.year,&book->date.month,&book->date.day);
printf("请输入出版社:");
scanf("%s",book->publisher);
}
void printBook(struct Book *book){
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);
}
int main(){
struct Book b1,b2;
printf("请输入第一本书的信息...\n");
getInput(&b1);
printf("请输入第二本书的信息...\n");
getInput(&b2);
printf("录入完毕,现在开始打印验证...\n\n");
printf("打印第一本书的信息...\n");
printBook(&b1);
printf("\n\n");
printf("打印第二本书的信息...\n");
printBook(&b2);
return 0;
}
十二、动态申请结构体
使用 malloc 函数为结构体分配存储空间。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: 字符编码介绍
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论