c语言结构体

本文详细介绍了C/C++中结构体的基本概念、声明与定义、定义与初始化的不同方式,以及结构体成员的直接和间接访问方法。重点讲解了结构体大小计算背后的对齐规则,包括对齐数和最大对齐数的概念。
摘要由CSDN通过智能技术生成

在这里插入图片描述

什么是结构体?

结构体是一种数据类型(结构),具体点讲,结构体是一些集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量,如:标量(内置类型)、数组、指针,甚⾄是其他结构体。

结构体的声明和定义

结构体的声明:用于告诉编译器有一个新的数据类型存在但并不分配内存空间 。我们一般把声明放在全局范围内,当然情况不同放的位置也不同。
结构体声明的一般结构:

struct tag
{
member-list;(成员列表)
};
struct是关键字,tag:标签(结构体的名字)。

struct stu
{
   	char name[10];
   	float score;
};//声明结构体但并不分配内存空间
结构体的定义则是在声明的基础上创建结构体变量,此时编译器会为变量分配内存。

定义和初始化的两种方式

struct stu
{
   	char name[10];
   	float score;
}s1;//声明并定义结构体变量
struct stu s2;//声明后定义变量

struct stu s3 = {"zhangti",99};//按成员变量的顺序初始化
struct stu s4 = {.name = "lisan",.score = 60} ;
//用操作符'.'访问成员变量,.name == char name[20]
struct Node
{
int data;
struct stu s5;
struct Node* next;//结构体成员变量为结构体类型
}n1 = {10,{"zhangsan",90},NULL}//结构体嵌套初始化

小结:结构体的声明就是告知编译器有一个新的数据类型,结构体的定义就是用结构体类型创建变量。

结构体成员的访问

直接访问

使用方式:结构体变量.成员名

#include <stdio.h>
struct point
{
    int x;
    int y;
    int z;
};
int main() 
{
    struct point p1 = { 0,0,0 };
    printf("%d %d %d", p1.x, p1.y, p1.z);
        return 0;
}

间接访问

使用方式:结构体指针->成员名

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
struct point
{
    int x;
    int y;
    int z;
};
int main() 
{
    struct point p1 = { 0,0,0 };
    struct point* ptr = &p1;
    ptr->x = 1;
    ptr->y = 1;
    ptr->z = 1;
    printf("%d %d %d", p1.x, p1.y, p1.z);
        return 0;
}

    

结构体的大小

struct S1
{
 char c1;
 int i;
 char c2;
};
printf("%d\n", sizeof(struct S1));

在这里插入图片描述

这个结果与你想的一样吗?为什么会是12呢?
想要弄明白就需要了解对齐规则。

对齐规则

1. 结构体的第⼀个成员对⻬到和结构体变量起始位置偏移量为0的地址处 (结构体成员的首地址位于结构体变量的启始位置)
2. 其他成员变量要对⻬到某个数字(对⻬数)的整数倍的地址处。(其他成员变量的首地址位于是对齐数整数倍的地址处)
对⻬数 = 编译器默认的⼀个对⻬数 与 该成员变量⼤⼩的较⼩值。 VS 中默认的值为 8
在这里插入图片描述

-Linux中 gcc 没有默认对⻬数,对⻬数就是成员⾃⾝的⼤⼩
3. 结构体总⼤⼩为最⼤对⻬数(结构体中每个成员变量都有⼀个对⻬数,所有对⻬数中最⼤的)整数倍。
4. 如果嵌套了结构体的情况,嵌套的结构体成员对⻬到⾃⼰的成员中最⼤对⻬数的整数倍处,结构体的整体⼤⼩就是所有最⼤对⻬数(含嵌套结构体中成员的对⻬数)的整数倍。

依据此规则分析一下输出12的原因:

在这里插入图片描述

结尾:初学结构体,此文章必有诸多不足,敬请指教。另外此文会持续更新的哟。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值