为什么要有结构体
结构体和其他类型基础数据类型一样,例如int类型,char类型 只不过结构体可以做成你想要的数据类型。以方便日后的使用。
在实际项目中,结构体是大量存在的。研发人员常使用结构体来封装一些属性来组成新的类型。由于C语言内部程序比较简单,研发人员通常使用结构体创造新的“属性”,其目的是简化运算。
结构体在函数中的作用不是简便,其最主要的作用就是封装。封装的好处就是可以再次利用。让使用者不必关心这个是什么,只要根据定义使用就可以了。
在C语言中,可以定义结构体类型,将多个相关的变量包装成为一个整体使用。在结构体中的变量,可以是相同、部分相同,或完全不同的数据类型。在C语言中,结构体不能包含函数。在面向对象的程序设计中,对象具有状态(属性)和行为,状态保存在成员变量中,行为通过成员方法(函数)来实现。C语言中的结构体只能描述一个对象的状态,不能描述一个对象的行为。在C++中,考虑到C语言到C++语言过渡的连续性,对结构体进行了扩展,C++的结构体可以包含函数,这样,C++的结构体也具有类的功能,与class不同的是,结构体包含的函数默认为public,而不是private。
#include<stdio.h>
#if 1
//复数运算用结构体实现
typedef struct complex//a + bi
{
double real;
double imag;
//[常见错误]
//struct complex data;//错误,递归定义
//struct complex *next;//可以,自引用,类型是struct complex * 4B
}Complex;
Complex comAdd(Complex first,Complex second)
{
Complex result; //变量.成员
result.real = first.real + second.real;//Complex类型变量不可相加,引用成员
result.imag = first.imag + second.imag;
return result;
}
Complex inputCom()
{
Complex c;
scanf("%lf%lf",&c.real,&c.imag);
return c;
}
void echo(Complex c)
{
printf("%g%+gi ",c.real,c.imag);
// "%g" ,意思就是在 "%f" 格式(实型的小数形式)和 "%e" 格式(实型的指数形式)当// 中,选择比较简短的表达 方式,并且不显示小数点后面结尾的一些 0。
//"%g%+gi" 若结果为负没有用,-1-2i;若结果为正,虚数应有+号 1+2i,否则是1 2i
}
void main(void)
{
//Complex c1 = {1,2};//对变量的成员初始化{}
//Complex c2 = {3,-4};//运算:同类型赋值,取址(结构体变量占内存所以有地址)
Complex c1,c2,c;
printf("输入复数1: ");
c1 = inputCom();
printf("输入复数2: ");
c2 = inputCom();
c=comAdd(c1,c2);
echo(c);
putchar(10);//换行
}
#endif
结构体内存对齐
变量非连续存储
- 结构体对齐模数k是结构体数据成员中最大类型的宽度(4),变量长度为k的最小整数倍
变量对齐模数是成员和结构体对其模数的最小值Char 1B,struct 4B 取小
8 B 12B
- 指定结构体对齐模数:VC 项目---属性---配置属性---C++---代码生成--指定对齐模数
- 结构体对齐和指定里最小值
#pragma pack(2)
6B 10B
#pragma pack(8)
8(取其小) 12B
结构体指针对变量进行访问
Complex c
Struct *p=&c;
P->real;
p->real.year = 2002;
(*p).real;
数组初始化:
C++中的结构体与类的区别
类与结构体在C++中有三点区别。
(1)class中默认的成员访问权限是private的,而struct中则是public的。
(2)从class继承默认是private继承,而从struct继承默认是public继承。
(3)C++的结构体声明不必有struct关键字,而C语言的结构体声明必须带有关键字(使用typedef别名定义除外)。