开发者学堂课程【你的第一门 C 语言课:结构体】学习笔记,与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/444/detail/5491
结构体
目录:
一、结构体
二、访问结构体变量
三、初始化结构体的指定成员值
四、算一算
一、结构体
C 语言提供了基本数据类型,int 整型、float 浮点型、double 双精度浮点型、char 字符型等等,这些不同的类型决定变量在内存中占据多大的空间,以及表现形式。
例如把97这个数字赋值给一个整型变量,那么它就应该在内存中占据4个字节的大小,表示的就是97这个数字,如果把97赋值给一个字符变量,那么它在内存中占据一个字节的空间,表示小写字母 a,有时候面对的问题比较复杂,并不是基本的数据类型就能对付的,例如相对论坛的好书推荐,写一个程序,采集每一本图书的信息,那么就需要一个变量统计多个数据。
例子:
1、图书名称
2、图书作者
3、图书售价
4、出版日期
5、出版社
6、ISBN 号
这时候会想到采用数组,数组允许多个数据存放到一块,但是存在一个问题,数组要求每一个元素的类型是一致的,图书名称、图书、作者可以采用数组来存储,但是图书售价需要采用浮点型的数据来存放,例如一本书卖48.8,49.9是一个浮点型,出版日期可以采用整型,例如2017年11月11日,就是20171111,ISBN号就是国际标准书号,通常是10位或者13位的数字组成。多种不同的数据类型应该如何存储?
C 语言以灵活多变而名扬天下,在 c 语言中,可以使用结构体来组织不同种类的数据,结构体声明是描述结构体结构的主要方法
结构体声明 :
Struct 结构体名称
{
结构体成员1;
结构体成员2;
结构体成员3;
……
}:
代码例子展示:
struct Book
{
char title[128];
char author[40];
float price;
unsigned int date;
char publisaher[40];
};
注意:这里的 struct 是必不可少的,因为他后面的声明是一个结构体的声明。
Book 是一个结构体的名称,通常为了与其他的结构体区别开,一般单词的第一个字母为大写,如果全部大写,通常规定为一个红的名字,蓝色的代表一个普通变量,但是只是约定的规矩,到了不同的公式会有不同的约定,只是建议,并不是必须。
定义结构体类型变量
结构体变量声明不会分配内存空间,只有定义结构体类型变量才会分配内存空间。
语法:
struct 结构体名称 结构体变量名
#inclued
struct Book
{
char title[128];
char author[40];
float price;
unsigned int date;
char publisaher[40];
};
int main(void)
{
struct Book book;
return 0;
}
二、访问结构体变量
要访问结构体成员,我们需要引入一个新的运算符——点号(.)运算符。比如book.title 就是引用 book 结构体的 title 成员,它是一个字符数组;而book.prince 则是引用 book 结构体的 prince 成员,它是一个浮点型的变量。
#inclued
struct Book
{
char title[128];
char author[40];
float price;
unsigned int date;
char publisaher[40];
} book;
int main(void)
{
printf(“请输入书名:”);
scanf(“%s”,book.title);
printf(“请输入作者:”);
scanf(“%s”,book.auther);
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.anther);
printf(“售价:%s\n”,book.price);
printf(“出版日期:%s\n”,book.date);
printf(“出版社:%s\n”,book.publisher);
return 0;
}
数据录入:
[fishc@bogon s1e42]$ vi testl.c
[ fishc@bogon s1e42]$ gcc test1.c && ./a. out
请输入书名:《带你学C带你飞〉
请输入作者:小甲鱼
请输入售价: 48.8
请输入出版日期: 20171111
请输入出版社:清华大学出版社
=====数据录入完毕=====
编译运行结果:书名:《带你学C带你飞》
作者:小甲鱼
售价:48.80
出版日期:20171111
出版社:清华大学出版社
[ fishc@bogon sle42 ]$
初始化结构体变量
l 初始化一个变量和数组
int a =520;
int array[5]={1,2,3,4,5};
l 初始化一个结构体变量:
struct Book book={
“《带你学c带你飞》”,
“小甲鱼”,
48.4;
20171111,
“清华大学出版社”
};
三、初始化结构体的指定成员值
1、其语法和数组指定初始化元素类似,不过结构体指定初始化成员使用点号(.)运算符和成员名。而数组使用的是方括号、下标值。
2、比如可以让程序只初始化 Book 的 price 成员;
struct Book book = {.price = 48.8};
3、还可以不按结构体声明的成员顺序进行初始化:
struct Book book = {
.publisher = “清华大学出版社”,
.price = 48.4,
.date = 20171111
};
四、算一算
#include
int main(void)
{
struct
A
{
char a;
int b;
char c;
} a={‘x’,520,’o‘};
printf("size of a =%d\n", sizeof(a));
return 0;
}
因为 char 占用一个字节,int 占据4个字节,所以结果等于6
但是编译器给的结果为12,是因为编译器对结构体的成员对齐后的结果,内存对齐让 cpu 更快的读取的处理方式
对齐前的空间分配
对齐后的空间分配:
int main (void)
{
struct A
{
char a;
char c ;
int b;
} a={'x',‘’520,'0'};
printf("size of a = %d\n“,sizeof(a)) ;
return 0 ;
}
再次执行后结果为8
调整后: