C语言基础八- 结构体
1. 初始化及使用
#include <stdio.h>
#include <string.h>
int main(void){
struct Student{
char name[20];
int age;
float height;
};
struct Student s1;
strcpy(s1.name,"张三");
s1.age = 25;
s1.height = 180.0;
printf("s1: name:%s age:%d height:%.2lf\n",s1.name,s1.age,s1.height);
struct Student s2 = {"xiaohong",13,140.0};
printf("s2: name:%s age:%d height:%.2lf\n",s2.name,s2.age,s2.height);
struct Student s3 = {
.name = "王五",
.age = 66,
.height = 160.0
};
printf("s3: name:%s age:%d height:%.2lf\n",s3.name,s3.age,s3.height);
}
2. 使用指针访问结构体变量
#include <stdio.h>
#include <string.h>
int main(void){
struct Student{
char name[20];
int age;
float height;
};
struct Student s1;
strcpy(s1.name,"张三");
s1.age = 25;
s1.height = 180.0;
struct Student *ptr = &s1;
ptr->age = 28;
printf("s1: name:%s age:%d height:%.2lf\n",s1.name,s1.age,s1.height);
printf("s1指针访问: name:%s age:%d height:%.2lf\n",ptr->name, ptr->age,ptr->height);
}
3. 函数中使用结构体
#include <stdio.h>
#include <string.h>
struct Student{
char name[20];
int age;
float height;
};
void prinftStd(struct Student s1);
void changeAge(struct Student *s1);
int main(void){
struct Student s1;
strcpy(s1.name,"张三");
s1.age = 25;
s1.height = 180.0;
prinftStd(s1);
changeAge(&s1);
prinftStd(s1);
}
void prinftStd(struct Student s1){
printf("s1: name:%s age:%d height:%.2lf\n",s1.name,s1.age,s1.height);
}
void changeAge(struct Student *s1){
s1->age = 28;
}
4. 结构体嵌套
#include <stdio.h>
#include <string.h>
struct Address{
char city[50];
char street[150];
};
struct Student{
char name[20];
int age;
float height;
struct Address address;
};
int main(void){
struct Student s1 = {
"小欣",16,170.0,{"北京","朝阳区"}
};
printf("name:%s age:%d address: %s %s \n",s1.name,s1.age,s1.address.city,s1.address.street);
}
5. 结构体数组
struct Student{
char name[20];
int age;
float height;
};
int main(void){
struct Student sArr[3] = {
{"小明",15,170.0},
{"小红",16,171.0},
{"小李",17,172.0},
};
int len = sizeof(sArr)/sizeof(sArr[0]);
for (int i = 0; i < len; i ++) {
struct Student s1 = sArr[i];
printf("s1: name:%s age:%d height:%.2lf\n",s1.name,s1.age,s1.height);
}
}
6. 匿名结构体
int main(void){
struct{
char name[20];
int age;
float height;
}s1 = {"xiaoming",34,234.0};
printf("s1: name:%s age:%d height:%.2lf\n",s1.name,s1.age,s1.height);
}
7. 内存对齐
- 结构体内存对齐:编译器为提高访问效率,会自动调整结构体成员的内存布局,导致实际占用空间可能大于成员总字节大小
int main(void){
struct Example{
char a;
int b;
char c;
};
printf("总的占用:%zu字节\n",sizeof(struct Example));
}