结构体

10 篇文章 0 订阅
struct Student// struct自定义类型
{
    int id;
    char name[20];
    char sex[3];
    int  age;
    float score;
};
void main()
{
    int a;//
    Student st;
    a=10;
    st.id=1;//点运算符
    //st.name = 'yhping';错误 name是一个数组名,代表首元素地址,不可能把一个字符串给一个地址。应该用拷贝字符串。
    strcpy(st.name,'yhping');
}

struct 相当于一个图纸
不能给结构体里的值赋初值

void main()
{
char name[20];
char *str;
name="yhping";//错误,首元素地址,不可能把一个字符串给一个地址。应该用拷贝字符串。要调用拷贝字符串
//"yhping"-字符串常量,存放在数据区中字符串常量区
str="yhping";//正确
}

结构体对齐方式

运算规则:
先看有没有干预
有->按干预方式对齐
无->
按基本数据类型对齐,前一个数据开辟的空间加上之前开辟的总空间要能被下一个数据类型整除,直到最后一个数据类型
最后看总开辟的空间大小能否被结构体中最大的数据类型整除
不能则补齐
1.

struct Node
{
    int a;
    int b;
    int c;
};

Node x;
sizeof(x)==>12

2.

struct Node
{
    char a;
    int b;
    char c;
};

Node x;
sizeof(x)==>12

这里写图片描述

  1. 系统默认对齐方式为 8 字节

  2. 开辟的总空间数能被结构体内最大字节类型整除

  3. 3.
struct Node
{
    char a;
    char c;
    int b;
};

Node x;
sizeof(x)==>8

这里写图片描述

干预对齐方式

4.

#pragma pack(1)// 1 2 4 8 16 

struct Node
{
    char a;
    int b;
    char c;
};
Node x;
sizeof(x)==>6

这里写图片描述

5.

#pragma pack(2)

struct Node
{
    char a;
    int b;
    char c;
};
Node x;
sizeof(x)==>8

这里写图片描述

6.

 #pragma pack(8)

struct Node
{
    char a;
    int b;
    char c;
};
Node x;
sizeof(x)==>12

只会按结构体中最大字节类型对齐

7.

#pragma pack(8) 
struct Node
{
    char ch[5];
};
Node x;
sizeof(x)==>5

只会按基本数据类型对齐

例题:
1.

struct Student
{
    int id;
    char name[20];
    char sex[3];
    int  age;
    float score;
};

sizeof(Student)=36

2.

struct Inventory
{
    char description[15]; //货物名称
    char  no[10];         //货号
    int quantity;          //库存数量
    double cost;           //成本
    double retail;         //零售价格
};

sizeof(Inventory)=48

这里写图片描述
3.

struct Employee
{
    char name[27] ;       //员工姓名
    char address[30] ;    //家庭住址
    long int zip ;        //邮政编码
    long int telenum ;     //联络电话
    double salary ;        //工资
};

sizeof(Employee)=48
27+30+3+4+4+4+8=80

4.

struct Mail
{
    char  address[30] ;     //地址
    long int zip ;           //邮政编码
    long int telenum ;//电话号码
};

struct Employee
{
    char name[25] ;       //员工姓名
    Mail addinfo ;         //结构作为成员,嵌套
    double salary ;  //工资
};
void main()
{
    cout<<sizeof(Employee)<<endl;
}
==>80

这里写图片描述

struct Student
{
    int id;
    char name[20];
    char sex[3];
    int  age;
    float score;
    char addr[30];
}Stud;//全局结构体变量

等价于 Student Stud;

typedef struct Student
{
    int id;
    char name[20];
    char sex[3];
    int  age;
    float score;
    char addr[30];
}Stud;//全局结构体变量

等价于 typedef Student Stud;

补充

typedef unsigned int u_int,*puint;
void main()
{
u_int x,y;//无符号整型
puint p.s;//无符号指针
} 

一切合法的变量定义都可以通过类型重定义转换为类型申明

typedef struct Student
{
    int id;
    char name[20];
    char sex[3];
    int  age;
    float score;
    char addr[30];
}Stud,x,y;//全局结构体变量

void main()
{
Student s;
stud s1;
x s2;
y s3;
}

正确

在linux下
int a=10;
type(a) b;//把a的类型给b

无名结构

struct 
{
    int id;
    char name[20];
    char sex[3];
    int  age;
    float score;
    char addr[30];
}Student;//全局结构体变量
struct Student
{
    int id;
    char name[20];
    char sex[3];
    int  age;
    float score;
    char addr[30];
}Student;

Student Student;//正确

初始化

struct Student
{
    int id;
    char name[20];
    char sex[3];
    int  age;
    float score;
    char addr[30];
};

int main()
{
Student st={1001,"yhp","nan",23,100,"xxx"};//一一对应,不能跳过
            {1001};//后面都初始化为0            
}

结构体设计不开辟空间

void Init_Student(Student &st)
{
    cin>>st.id;
    cin>>st.name;
    cin>>st.sex;
    cin>>st.age;
    cin>>st.score;
    cin>>st.addr;
}

void Print_Student(const Student &st)
{
    cout<<"id "<<st.id<<endl;
    cout<<"name "<<st.name<<endl;
    cout<<"sex "<<st.sex<<endl;
    cout<<"age "<<st.age<<endl;
    cout<<"score "<<st.score<<endl;
    cout<<"addr "<<st.addr<<endl;
}

void main()
{
    Student s1={0};
    Init_Student(s1);
    Print_Student(s1);
}
void Init_Student(Student *sp)
{
    if(sp == NULL) return ;
    sp->id = 1001;
    strcpy_s(sp->name,"yhping");
    strcpy_s(sp->sex,"男");
    sp->age = 23;
    sp->score = 100;
    strcpy_s(sp->addr,"xxxxxx");
}
void Print_Student(const Student *sp)
{
    if(sp == NULL) return ;
    cout<<sp->id<<endl;
    cout<<sp->name<<endl;
    cout<<sp->sex<<endl;
    cout<<sp->age<<endl;
    cout<<sp->score<<endl;
    cout<<sp->addr<<endl;
}
void main()
{
    Student s1={0};
    Init_Student(&s1);
    Print_Student(&s1);
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值