结构与联合

这篇博客详细介绍了C语言中的结构基础知识,包括结构声明、成员访问方式、结构体初始化,以及结构指针和成员的访问。强调了结构体与数组的区别,结构体不能直接替换为指针,其成员可以通过直接或间接方式访问。还讨论了结构体的存储形式,指出结构体在定义时不占用内存,只有在实例化时才分配空间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.结构基础知识:

聚合数据结构:数组
结构体
结构体值的集合称为成员
数组通过下标,结构体通过名字访问–区别非常重要
结构体与数组不一样,并不能替换为指针。
结构体属于标量不能进行加减乘除,但可以赋值

1.1结构声明:

在C语言中,并没有规定结构体所分配的内存是连续的,但是有些编译器会分配连续的空间给结构体

struct 
{
    int x;
}z;

struct 
{
    int x;
}y;

z = y
//error 不能将struct <unnamed>类型的值分配到struct <unnamed>
struct a
{
    int x;
}f;
//**a标识了一种模式,用于声明变量。**
typedef struct b
{
    int x;
}h;
//因为有typedef的存在,所以在这里h表示的是一种类型,而不是一种变量。

1.2结构成员

结构体中可以包含很多类型的数据

struct COM
{
    int h;
    char b;
    float c[20];
    double d;
    struct a;
};

1.3结构体成员的直接访问

COM.h;
(COM.a).a;
//双结构体的直接访问
(COM.c)[4]
//下标引用和点操作符具有相同的优先级

1.4结构体成员的间接访问

如果有指向结构体的指针,则用箭头运算符来进行间接访问成员。

struct as
{
    int a;
    char b;
};
struct as *p;
p->a;
p->b;
//OR
(*p).a;
(*p).b;

这是两种操作符的区别

1.5结构体的自引用

struct St
{
    int a;
    int c;
    struct St;
};
//error 会导致结构体无限制的引用下去
struct St1
{
    int a;
    int c;
    struct St1 *p;
}
//OK.

typedef struct
{
    int a;
    int c;
    struct St1 *p;
} St2;
//error St2为自己所定义的类型,但是在这个类型内部,这个结构体还没定义就已经使用,明显是非法的。

1.7结构体的初始化

2.结构指针和成员

typedef struct
{
    int a;
    short b;
} EX2;
typedef struct EX
{
    int a;
    char b[3];
    EX2 c;
    struct EX *b;
} EX;
EX x= {10,"Hi",{5,{-1,25}},0};
EX *px = &x;

2.1访问指针:

再次重申:
在C语言中,并没有规定结构体所分配的内存是连续的,但是有些编译器会分配连续的空间给结构体

px指向结构体的第一个元素。
*(P+1)是非法的,原因同上

2.3访问结构成员

比较*p and p->a;
这两种操作都是指向结构体的第一个元素,但是略有不同。
*p指代的是整个结构体
p->a,指向的是他的第一个成员。

int *fp;
fp = p;//error,类型不匹配

2.4访问嵌套的结构

p->c.a
p->c指向结构体C,结果并不是一个指针,而是一个变量。所以用c.a来直接访问
*(p->c.b)指向结构体c的数组b的第一个元素

3.结构的存储形式:

参看其他的博文所总结的:

由于结构体本身就是自定义的数据类型,定义结构体变量的方法和定义普通变量的方法一样。
注意:结构体生命的时候本身不占用任何内存空间,只有当你用你定义的结构体类型定义结构体变量的时候计算机才会分配内存。
结构体,同样是可以定义指针的,那么结构体指针就叫做结构指针。
结构体可以描述数组不能够清晰描述的结构,它具有数组所不具备的一些功能特性。
void print_score(struct a*pn)的效率是要高过void print_score(struct a pn)的,因为直接内存操作避免了栈空间开辟结构变量空间需求,节省内存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值