数据类型之结构体

一,结构体的基本用法

查看菜鸟教程:http://www.runoob.com/cprogramming/c-structures.html

二,易错难点

(1)C和C++中结构体的区别

  1. C的结构体内不允许有函数存在,C++允许有内部成员函数,且允许该函数是虚函数。所以C的结构体是没有构造函数、析构函数、和this指针的。
  2. C的结构体对内部成员变量的访问权限只能是public,而C++允许public,protected,private三种。
  3. C语言的结构体是不可以继承的,C++的结构体是可以从其他的结构体或者类继承过来的。
  4. C中定义一个结构体类型要用typedef,如下:
typedef struct Complex{
  int read;
  int image;
}Complex;

那么,在说明Complex变量的时候可以这样写Complex complex;
但是如果没有typedef就必须用struct Complex complex;
这里的Complex实际上就是structComplex的别名。另外这里也可以不写Complex(于是也不能struct Complex complex;了)

typedef struct{
  int read;
  int image;
}Complex;

但在c++里很简单,直接

struct Complex{
  int read;
  int image;
};

于是就定义了结构体类型Complex,声明变量时直接Complex complex。
5.在c++中如果用typedef的话,又会造成区别:

struct Complex1{
  int read;
  int image;
}complex;//complex是一个变量
 
typedef   struct   Complex2{
  int read;
  int image;
}Complex2;//Complex是一个结构体类型

使用时可以直接访问complex.read,但是Complex2则必须先Complex2 complex2;然后complex2.read = 1;
(2)结构体内存对齐
结构体内存对齐:元素是按照定义顺序一个一个放到内存中去的,但并不是紧密排列的。从结构体存储的首地址开始,每个元素放置到内存中时,它都会认为内存是按照自己的大小来划分的,因此元素放置的位置一定会在自己宽度的整数倍上开始。

for example2:
 struct   A
	     {
            int a;
            char b;
            double c;
            char d;
         };

解析: 在windows系统32位平台上:
int占4个字节
char占1个字节
float占4个字节
double占8个字节
int a从0偏移开始,占四个字节,即占用0,1,2,3,现在可用偏移为4偏移,接下来存char b; 由于4是1的倍数,故而,b占用4偏移,接下来可用偏移为5偏移,接下来该存double c; 由于5不是8的倍数,所以向后偏移5,6,7,都不是8的倍数,偏移到8时,8是8的倍数,故而c从8处开始存储,占用8,9,10,11,12,13,14,15偏移,现在可用偏移为16偏移,最后该存char d ;因为16是1的倍数,故d占用16偏移,接下来在整体向后偏移一位,现处于17偏移,min(默认对齐参数,类型最大字节数)=8;因为17不是8的倍数,所以继续向后偏移18…23都不是8的倍数,到24偏移处时,24为8的整数倍,故而,该结构体大小为24个字节。
内存对齐基本原则:
原则:
1.结构体内成员按自身按自身长度自对齐。
自身长度,如char=1,short=2,int=4,double=8,。所谓自对齐,指的是该成员的起始位置的内存地址必须是它自身长度的整数倍。如int只能以0,4,8这类的地址开始
2.结构体的总大小为结构体的有效对齐值的整数倍
结构体的有效对齐值的确定:
1)当未明确指定时,以结构体中最长的成员的长度为其有效值
2)当用#pragma pack(n)指定时,以n和结构体中最长的成员的长度中较小者为其值。
3)当用__attribute__ ((packed))指定长度时,强制按照此值为结构体的有效对齐值

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值