C 和指针读书笔记--结构体和联合

完整的声明

typedef struct  structName{

//members

} Struct structtest;

声明一个结构体,名称是structName,并且通过typedef定义为类型Struct,同时声明一个结构体变量structtest。

此时通过删减定义逐一分析每一处的作用

(1)

struct  structName{

//members

}structtest; 省略类型定义,此后再使用该结构定义的时候只可以通过struct structName去定义

(2)

struct  {

//members

}structtest; 省略结构体标示符,这是一个很重要的概念,一旦省略结构体标示符,要声明该种类型的结构体,就只有一种方式,即直接在后面加声明。在其他地方通过这种方式再定义结构体,即使成员列表一致,它们也不再属于同一类型,互相之间也不可以赋值

(3)struct structName;省略成员列表,仅仅是一个向前声明,表示在后面可能存在struct structName这个结构体的定义。

关于嵌套

一个结构体不可以嵌套自身的定义。因为这会造成无限递归,但是结构体可以含有自身的指针,(例如链表的实现)这样不会造成无线递归的问题。

typedef struct  structName{

//members

Struct *next;//这样是不对的

struct structName *next;//可以

} Struct structtest;

互相嵌套

struct A;

struct B

{

struct A;

}

struct A

{

struct B;

}

简单来说凡是要出现的内容应该在之前有声明,这也引入向前声明的重要性。

关于结构体内存对齐

 结构体中成员变量会避免发生对同一个变量的跨字节存储,因为内存的访问方式通常是某一个数的整数倍(例如4),如果将一个四字节的整形放在两个块中,读取这个整形就要分别读两个块。这不好所以通常会字节对齐

比如

struct AlignTest{

char a;

int b;

char c;

}

通过四字节对齐这个结构体占用空间为12字节(32位机)

但是如果改变定义顺序为

struct AlignTest{

char a;

char b;

int c;

}

此时结构体占用字节数为8字节。这个细节有可能会造成很大的性能提升。



另外简单的提一点,结构体是可以作为参数和返回值的,但是这并不是推荐的做法。因为不管是参数还是返回值都会有一次拷贝的过程。如果结构体比较大,需要拷贝的内容比较多,这通常不是明智的做法。明智的做法应该是通过指针传递数据。


关于联合union

union简单的说就是一个可以表示多种类型的数据结构。和结构体定义类似但是存储完全不同。结构体是根据先后顺序每一个成员都用对应的存储空间,union则是保证可以容下最大的那个成员,为哪个成员赋值就保存哪个成员对应的类型和值,即对于同一块存储空间,编译器可以通过不同的方式解读其内容。对于简单类型可以直接定义,但是对于含有大容量数据的话,保存数据的指针应该是明智的。这样可以避免空间的浪费

union AllTypes

{

 int a;

float b;

char pt[100];//此处的定义导致此联合占用100字节,但是如果声明到char *pt;就会好很多。

}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值