(C语言)结构体

目录

1. 结构体

1.1 结构体的声明

1.2 结构体变量的定义和初始化

1.3 结构体成员访问

1.4 结构体传参

1.5 结构的自引用

1.6 结构体内存对齐


1. 结构体

结构的基础知识:结构体也是一种数据类型(像 int,char,long是数据类型一样),结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,它的出现使我们可以对复杂事物进行描述,是对以往数据类型的单一性描述进行补充。

1.1 结构体的声明

声明一个结构体类型的一般形式为:

当对一个复杂对象进行定义时:

这里我们对一个学生进行描述时,用以往单一的数据类型是难以描述的,因此这里采用了结构体。

注意

1.结构体在声明时,最后的分号不可以丢

2.结构体一般不会定义到主函数内 

当这样定义时其它函数将没法去使用这个结构体了 

特殊的声明: 

在声明结构的时候,可以不完全的声明。

例如:

 

 我们在声明一个结构体时 ,可以匿名结构体类型(结构体可以理解为是一种数据的类型,对这样一个数据的类型我们在定义时可以去匿名),但是当我们定义了一个结构体变量*p时,此时&x并把这个地址存到p中时,会报错,因为匿名了结构体类型,编译器会把上面的2个结构体当成2种不同的结构体类型,所以执行p = &x ;操作时编译器会去报错。

1.2 结构体变量的定义和初始化

对于结构体变量的定义有2种方式,第1种是定义到结构体的结尾处,第2种是定义到结构体之外,这2种方式的定义还是有一定的区别,对于第2种要注意的是要在变量名前加上结构体类型。

1.3 结构体成员访问

对于结构体成员访问有2种方式:1.结构体变量访问成员 2.结构体指针访问指向变量的成员

 1.结构体变量名.成员名(点操作符接受2个操作数)                                                                       2.指针变量名->成员名

1.4 结构体传参

对于 print1 和 print2 函数哪个更好呢?

print2更好,因为函数传参的时候,参数是需要压栈的,会有时间和空间上的系统开销,              如果传递的是一个结构体对象的时候,当结构体过大时,参数压栈的系统开销是比较大的,会导致性能上的下降。

1.5 结构的自引用

当在结构体中以   Node*next; 去当作 struct Stu* next;   去对结构进行自引用是行不通的,虽然  我们以经对其typedef了,正确的方式如下:

还要注意的一种情况是:

 对于上面2种结构的自引用,第1种是一种错误的引用方式,应该以结构体指针的形式去引用。

1.6 结构体内存对齐

问:对于一个结构体而言我们应该如何去计算它的大小呢?

答:结构体内存对齐可以回答。

结构体在内存对齐的规则:       

1.第一个成员在与结构体变量偏移量为0的地址处。

2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。

     对齐数 =  编译器默认的一个对齐数 与 该成员大小的较小值

   (vs中默认的值为8)       

3.结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。

4.如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。 

例1:(默认在vs中)

struct S1
{
    char c;
    int i;
    char a;
}s;

  模拟计算下: 

                                    

 实际计算下:

 例2:(默认在vs中)

struct S1
{
    int a;
    char b;
    char c;
};

struct S2
{
    char a1;
    struct S1 s1;
    double b1;
}s;

 模拟计算下:

实际计算下:

 为什么存在内存对齐?

1.性能原因:提高我们的访问效率(但内存对齐实际上是一种牺牲空间来提高访问效率的一种方式,但对于现在的计算机而言,空间不在是一种奢侈品)

2.硬件原因:不是所有的硬件平台都能访问任意地址上的任意数据的,倘若代码移植到其他不支持的平台上,将会出现问题,因为它不具有可移植性。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值