结构体|学习笔记

简介: 快速学习结构体

开发者学堂课程【你的第一门 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

目录
打赏
0
0
0
0
55
分享
相关文章
cnpm : 无法将“cnpm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。所在位置 行:1 字符: 1
cnpm : 无法将“cnpm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。所在位置 行:1 字符: 1
1007 0
Spring Boot自动配置是通过`@EnableAutoConfiguration`注解启用的
【6月更文挑战第18天】Spring Boot的`@EnableAutoConfiguration`启动自动配置,基于类路径扫描和条件注解(如@ConditionalOnClass)选择性应用配置。当检测到特定依赖时,自动配置模块会将对应的bean添加到应用上下文,简化了XML或Java配置。只需添加依赖,即可自动配置功能。
117 4
Java中的Lambda表达式:简化代码,提升效率
在Java的世界中,Lambda表达式的引入无疑是一次革命性的创新。它不仅为开发者提供了一种更为简洁、直观的编程方式,还在提高代码可读性与执行效率方面发挥了重要作用。本文将深入探讨Lambda表达式的基本概念、语法特点及其在实际开发中的应用案例,帮助读者理解并掌握这一强大工具的使用。
【4. ROS的主要通讯方式:Topic话题与Message消息】(1)
【4. ROS的主要通讯方式:Topic话题与Message消息】(1)
672 0
用if语句处理选择结构举例
在编程中,选择结构是一种根据特定条件来决定执行哪段代码的结构。而if语句则是实现选择结构的一种常用方式。通过if语句,我们可以根据条件的真假来执行不同的代码块。下面将通过几个示例来展示如何使用if语句处理选择结构。
110 0
如何配置https站点
如何配置https站点 第一步 配置一个https站点需要有一个ssl的证书,我们可以去申请一个免费的ssl证书:     第二步 有了ssl的证书后,我们可以将需要的服务器类型的压缩包解压后上传到服务器中。
1943 0
在Dataphin中配置了一个日调度的表
在Dataphin中配置了一个日调度的表
93 2
Python编程基础:文件基础
文件操作作为Python基础知识的一部分也非常的重要,熟练的掌握文件的各项操作,将来我们在数据分析、机器学习等一系列领域中才能更好的进行数据处理。
207 0
Python编程基础:文件基础
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等