C语言笔记之结构体

简介:

    结构的本质是C语言的一种数据抽象,通俗的说,是基本数据类型的重组。

为什么要重组呢?由于基本数据类型不够用了。为什么不够用了呢?由于须要的信息类型太多了。

这是一个非常大的话题。信息本来是没有什么类型之分的,可是为了便于在计算机内部的管理,人们在C语言中把信息先分成了主要的几个类型。比方整型、浮点型、字符型、布尔型等等。可是呢,描写叙述一个事物的所有信息有时候仅用一种基本类型是不够的,比方一本书的基本属性:作者(字符型)、价格(浮点型)、出版日期(我也不知道什么型)、书名(字符型)。

然而操蛋的是,我们要处理的并不是是这本书的某个属性,而是总体,这时候我们仅仅好把各种类型组合起来构造一种全新的数据类型——这正是发挥我们想象力和创造力的时候。

除了基本类型以外并由其组合而成的新类型统称为结构体。


1、在C语言中。要创造一个全新的数据类型,首先要定义这么一个类型。告诉编译器这个新类型由哪些基本类型组成。标准的定义形式例如以下: 
struct book
{
    int price;
    char title[44];
};

        首先是keywordstruct。表明这不是一个基本类型;然后是一个标记(tag),相当于给新类型起的名字。可是这个名字并不是必须的,以下会谈到为什么写上比較好。最后是新类型的成员,须要放在花括号中面且表明基本数据类型。须要注意的是。末尾须要加上分号,由于这仅仅是类型定义,属于一种声明,声明都要以分号结尾。类型定义并不分配内存空间。他仅仅是创造了一个模版。以后用这个模版定义变量的时候才真正的分配内存。


2、定义结构体变量
有了类型就能够定义变量。如:
struct book 
{
    int price;
    char title[44];
} a, b;
a和b被定义为struct book类型的变量,然后依照模版分配内存空间。
也能够这样定义变量:
struct
{
    int price;
    char title[44];
} a; 

以上两张形式的定义差别在于:一个有tag一个没有。

但不管哪一种都略显臃肿,尤其是成员众多的时候。

这时。tag的作用就显示出来了,我们能够简化定义的形式:
struct book a, b;
注意struct不能省略,tag必须和struct一起使用,才干相当于int、float等基本类型。而没有tag直接定义变量的形式就不能享受这样的便利了。

并且tag的作用并不是仅限于简化定义形式。实际上,仅仅有定义了tag,这个模版(新类型)才干够被重复使用(即定义变量)而不引起混淆。

像以下这样:
struct
{
    int price;
    char title[44];
} a; 


struct
{
    int price;
    char title[44];
} *b; 


要注意两个结构体是不同的。至少在编译器眼里是不同的,即使他们的成员一样。比方 b = &a; 这是非法的。而有了tag就能够避免这种混淆——tag能够把成员同样的结构默觉得同一种类型。
另外,不加tag的形式仅仅能在定义变量的时候使用,换言之,以下的类型定义(声明)是没有意义的:
struct
{
    int price;
    char title[44];

};


3、初始化
能够这样:
struct book a = {43.5, "agv"};
成员之间用逗号隔开,同一时候成员顺序要和模版保持一致,即类型要匹配。

假设成员比模版声明的要多就会报错;假设少于模版数量,未指定值的项目会被置为0或空。多余的逗号不会报错。
也能够这样:
struct book a = {.title = "agv", .price = 43.5};
这样的形式就不必依照模版的顺序赋值。可是要注意一点。假设这样:
struct book a = {.title = "agv", .price = 23.1, "ree"};
那么最后title的值究竟是多少?答案是“ree”。先前的会被后来的覆盖。由于title的确是在price之后的,price赋值后非常自然的继续给title赋值。

初始化的时候。若结构体变量是全局变量,则必须使用常量表达式初始化成员;若结构体是局部变量。则能够是变量表达式初始化成员。


4、赋值
赋值和初始化是不同的(多么痛的领悟啊)!

。!!!
结构体基本上没有赋值这一说,比方以下的做法是错的:
struct book a;
a = {.title = "agv", .price = 43.5};
数组也是这么规定的。可是结构体变量之间能够相互赋值。比方:
struct book a。b;
a = b;

只是仅限于局部变量。


可是,我们能够对结构体的各个成员分别赋值,就像普通变量那样:

a.title = "agv";

a.price = 43.5;


5、訪问成员变量
两个符号: . 和 ->。组合起来有三种方式。
struct book a;
printf("a.title\n");


struct book *b;
b = &a;
printf("b->title\n");


struct book *b;
b = &a;
printf("(*b).title\n");


这里显然有b->title == a.title,仅仅只是->专门用于指针,而.用于结构变量本身罢了。




基本内容就这么多了。以后会继续补充。








本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5101042.html,如需转载请自行联系原作者


相关文章
|
15天前
|
存储 C语言
如何在 C 语言中实现结构体的深拷贝
在C语言中实现结构体的深拷贝,需要手动分配内存并逐个复制成员变量,确保新结构体与原结构体完全独立,避免浅拷贝导致的数据共享问题。具体方法包括使用 `malloc` 分配内存和 `memcpy` 或手动赋值。
25 10
|
14天前
|
存储 大数据 编译器
C语言:结构体对齐规则
C语言中,结构体对齐规则是指编译器为了提高数据访问效率,会根据成员变量的类型对结构体中的成员进行内存对齐。通常遵循编译器默认的对齐方式或使用特定的对齐指令来优化结构体布局,以减少内存浪费并提升性能。
|
19天前
|
编译器 C语言
共用体和结构体在 C 语言中的优先级是怎样的
在C语言中,共用体(union)和结构体(struct)的优先级相同,它们都是用户自定义的数据类型,用于组合不同类型的数据。但是,共用体中的所有成员共享同一段内存,而结构体中的成员各自占用独立的内存空间。
|
19天前
|
存储 C语言
C语言:结构体与共用体的区别
C语言中,结构体(struct)和共用体(union)都用于组合不同类型的数据,但使用方式不同。结构体为每个成员分配独立的内存空间,而共用体的所有成员共享同一段内存,节省空间但需谨慎使用。
|
23天前
|
编译器 C语言 C++
C语言结构体
C语言结构体
21 5
|
1月前
|
C语言
C语言结构体链式结构之有头单链表
文章提供了一个C语言实现的有头单链表的完整代码,包括创建链表、插入、删除和打印等基本操作。
20 1
|
1月前
|
C语言
初识C语言6——结构体
初识C语言6——结构体
18 3
|
1月前
|
存储 编译器 C语言
【C语言】探索结构体基础知识:简明概要
【C语言】探索结构体基础知识:简明概要
|
24天前
|
编译器 Linux C语言
C语言 之 结构体超详细总结
C语言 之 结构体超详细总结
14 0
|
29天前
|
存储 编译器 Linux
深入C语言:探索结构体的奥秘
深入C语言:探索结构体的奥秘