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
系统默认对齐方式为 8 字节
开辟的总空间数能被结构体内最大字节类型整除
- 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);
}