结构体|学习笔记

简介: 快速学习结构体

开发者学堂课程【你的第一门 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 更快的读取的处理方式

对齐前的空间分配

图片43.png

对齐后的空间分配:

图片44.png

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

调整后:

图片45.png

相关文章
|
4月前
|
C++
c++学习笔记07 结构体
C++结构体的详细学习笔记07,涵盖了结构体的定义、使用、数组、指针、嵌套、与函数的交互以及在结构体中使用const的示例和解释。
40 0
|
7月前
|
存储 算法 数据安全/隐私保护
结构体
结构体
62 1
|
6月前
初识结构体
初识结构体
47 5
|
6月前
|
编译器 Linux C语言
浅谈结构体
浅谈结构体
42 1
|
5月前
|
存储 程序员 编译器
|
6月前
|
存储 算法 C++
C++结构体
C++结构体
|
7月前
|
存储 算法 C语言
c结构体
c结构体
35 1
|
7月前
|
算法 C语言
结构体相关知识
结构体相关知识
|
机器学习/深度学习 存储 编译器
Day_16 结构体
Day_16 结构体
|
7月前
|
Java 编译器 Linux
再次认识结构体
再次认识结构体
71 0