C/C++结构体

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__));

希望我们都能像对方一样勇敢。 —撒野

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MzKyle

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值