C语言基础八- 结构体

62 阅读2分钟

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);
    
    //c99初始化
    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);  // s1: name:张三  age:25  height:180.00
    changeAge(&s1);
    prinftStd(s1); // s1: name:张三  age:28  height:180.00
    
}

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>


// Address 一定得放在上面
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,{"北京","朝阳区"}
    };
    //name:小欣  age:16  address: 北京 朝阳区
    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; //1字节
        int b;  //4字节
        char c; //1字节
    };
    
    printf("总的占用:%zu字节\n",sizeof(struct Example));  //总的占用:12字节
}