C/C++结构体
结构体是构造数据类型,构造数据类型也称为用户定义类型(User Defined Type,UDT),其实是相对于内部数据类型(如char,int,double)而言的。
定义形式
struct 结构体名称{
数据类型 成员名 1;
数据类型 成员名 2;
...
数据类型 成员名 n;
}; //结构体与类的大括号外都要有;,刚入手的萌新尤其要注意!
关键字 typedef的用法
定义形式
typedef 原类型名 新类型名;
也可以修改内部数据类型(int,char…)的名字。
eg:
typedef unsigned short int TCHAR; //原类型名是unsigned short int 新类型名是 TCHAR
typedef char * CP; //原类型名是char * 新类型名是CP
结构体变量定义的三种形式
1.结构体类型和结构体变量同时定义
struct employee{
char name[20];
int age;
char sex;
int id;
}e; //定义结构体类型的同时定义结构体变量
int main(){
strcpy(e.name,"Xiao ming");
e.age=18;
e.sex="M"
e.id=0;
printf("%s\n%d\n%c\n%d\n",e.name,e.age,e.sex,e.id);
return 0;
}
2.结构体类型和结构体变量分开定义
struct employee{
char name[20];
int age;
char sex;
int id;
};
struct employee e1,e2,e3;
3.直接定义结构体变量(匿名结构体)
struct {
char name[20];
int age;
char sex;
int id;
}e1,e2,e3;
结构体变量的输入,输出和赋值
结构体变量无法整体输入、输出,只能选用合适的控制符输入,输出结构体的各分量。结构体变量的赋值就是给各分量赋值。
结构体数组
结构体数组中的元素必须为同一种结构体类型。
typedef struct student{
int num;
char name[100];
char sex;
double score;
} Student;
Student stu[3];
//初始化
Student stu[3]={{1,"li ming","m",80},{2,"wang lin","M",90.0},{3,"linxia","f",95.6}};
结构体指针
一个指针的目标类型为结构体变量时,称为结构体指针。
//格式:结构体类型名 *结构体指针变量
typedef struct student{
int num;
char name[100];
char sex;
double score;
};
struct student s1,s2,sa[10],*ps;
//调用格式:(*结构体指针变量).成员名
(*ps).num;
//或者用this指针,效果相同。
ps->num;
结构体与函数
#include<stdio.h>
typedef struct point{
int x;
int y;
}POINT;
POINT nextPoint(POINT s){
s.x++;
s.y++;
return s;
}
void step(POINT *p){
p->x++;
p->y++;
}
void print(POINT h){
printf("(%d,%d)\n",h.x,h.y);
}
int main(){
POINT a={0,0},b;
printf("a经过初始化的值:");
print(a);
printf("b未经初始化的值:");
pirnt(b)
b=a; //同类型结构体变量之间可以直接赋值
printf("执行b=a;后b=");
print(b);
b=nextPoint(a);
printf("执行b=nextPoint(a);后b=");
print(b);
step(&b);
printf("执行step(&b);后b=");
print(b);
return 0;
}
输出结果为
a经过初始化的值:(0,0)
b未经初始化的值:(-858993460,-858993460)
执行b=a;后b=(0,0)
执行b=nextPoint(a);后a=(0,0)
执行b=nextPoint(a);后b=(1,1)
执行step(&b);后b=(2,2)
结构体的压缩操作(取消对齐)
结构体是默认自动对齐数据位的,结构体总大小为最大对齐数(结构体中每个成员变量都有⼀个对齐数,所有对齐数中最大的)的整数倍。
eg:结构体中有char(1位)和int(4位),结构体的存储占用是8位。
packed属性:使用该属性可以使得变量或者结构体成员使用最小的对齐方式,即对变量是一字节对齐,对域(field)是位对齐。
attribute__关键字主要是用来在函数或数据声明中设置其属性。此外 ,给函数赋给属性的主要目的在于让编译器进行优化(__attribute__书写特征是:__attribute__前后都有两个下划线,并且后面会紧跟一对括弧,括弧里面是相应的__attribute__参数。)
//结构体的优化
struct my_unpacked_struct
{
char c;
int i;
};
struct my_packed_struct
{
char c;
int i;
struct my_unpacked_struct s;
}__attribute__ ((__packed__));
希望我们都能像对方一样勇敢。 —撒野