C语言学习(7)—— 结构体和共用体

一、结构体

struct 结构体名{                    // 结构体名首字母大写

        成员变量列表;               // 成员变量可以是基本数据类型、指针或者结构体等

}

访问成员变量的方式:① “ . ”:直接对结构体成员变量进行访问;②  “ -> ”:通过存放结构体变量的指针(结构体的地址)来访问结构体的成员变量。

定义结构体和结构体变量的三种方式:

 (1)先定义结构体,在使用时再定义结构体变量

#include    

// 自定义一个结构体 Person,是一个自定义的数据类型
struct Person{
    char *name;
    int age;
};

int main(){
    // 定义 结构体数据类型Person 的 结构体变量
    struct Person person1;                   // 先定义结构体变量,之后进行赋值   
    struct Person person2 = {"Jack", 20};     // 在定义变量的同时进行赋值

    struct Person *person3;                  // 通过指针来访问结构体的成员变量, 不能在定义变量的同时进行赋值
    struct Person *person4 = &person2;       // 通过存放结构体变量的指针(结构体的地址)来访问结构体的成员变量,person4指向了person2的地址



    person1.name = "Tom";      // 直接对结构体成员变量进行访问
    person1.age = 23;

    person3->name = "Tom";     // 通过指针来访问结构体的成员变量
    person3->age = 23;    
    printf("person1: name = %s, age = %d \n", person1.name, person1.age);       // person1: name = Tom, age = 23
    printf("person2: name = %s, age = %d \n", person2.name, person2.age);       // person2: name = Jack, age = 20
    printf("person3: name = %s, age = %d \n", person3->name, person3->age);     // person3: name = Tom, age = 23


 
    person4->name = "Tom";     // 通过指针来访问结构体的成员变量,相当于修改了person2
    person4->age = 23;   
    printf("person2: name = %s, age = %d \n", person2.name, person2.age);       // person2: name = Tom, age = 23
    printf("person4: name = %s, age = %d \n", person4->name, person4->age);     // person4: name = Tom, age = 23

 

    (*person4).name = "Jack";     // 通过指针来访问结构体的成员变量,相当于修改了person2
    (*person4).age = 20;   
    printf("person2: name = %s, age = %d \n", person2.name, person2.age);       // person2: name = Jack, age = 20
    printf("person4: name = %s, age = %d \n", person4->name, person4->age);     // person4: name = Jack, age = 20

    return 0;
}

(2) 在定义结构体的同时定义结构体变量

#include    

struct Person{
    char *name;
    int age;
}person1, person2 = {"Jack", 20}, *person4 = &person2;    // 在这里不能直接定义指针变量 *person3

int main(){
    person1.name = "Tom";      
    person1.age = 23;
    printf("person1: name = %s, age = %d \n", person1.name, person1.age);       // person1: name = Tom, age = 23
    printf("person2: name = %s, age = %d \n", person2.name, person2.age);       // person2: name = Jack, age = 20


 
    person4->name = "Tom";     
    person4->age = 23;   
    printf("person2: name = %s, age = %d \n", person2.name, person2.age);       // person2: name = Tom, age = 23
    printf("person4: name = %s, age = %d \n", person4->name, person4->age);     // person4: name = Tom, age = 23

 

    (*person4).name = "Jack";     
    (*person4).age = 20;   
    printf("person2: name = %s, age = %d \n", person2.name, person2.age);       // person2: name = Jack, age = 20
    printf("person4: name = %s, age = %d \n", person4->name, person4->age);     // person4: name = Jack, age = 20

    return 0;
}

(3) 如果只需要 person1、person2 两个变量,后面不需要再使用结构体时,在定义结构体时也可以不给出结构体名。

#include    

struct{
    char *name;
    int age;
}person1, person2 = {"Jack", 20}, *person4 = &person2;    // 在这里不能直接定义指针变量 *person3

int main(){
    person1.name = "Tom";      
    person1.age = 23;
    printf("person1: name = %s, age = %d \n", person1.name, person1.age);       // person1: name = Tom, age = 23
    printf("person2: name = %s, age = %d \n", person2.name, person2.age);       // person2: name = Jack, age = 20


 
    person4->name = "Tom";     
    person4->age = 23;   
    printf("person2: name = %s, age = %d \n", person2.name, person2.age);       // person2: name = Tom, age = 23
    printf("person4: name = %s, age = %d \n", person4->name, person4->age);     // person4: name = Tom, age = 23

 

    (*person4).name = "Jack";     
    (*person4).age = 20;   
    printf("person2: name = %s, age = %d \n", person2.name, person2.age);       // person2: name = Jack, age = 20
    printf("person4: name = %s, age = %d \n", person4->name, person4->age);     // person4: name = Jack, age = 20

    return 0;
}

二、共用体

union 共用体名{                    // 结构体名首字母大写

        成员变量列表;               // 成员变量可以是基本数据类型、指针或者结构体等

}

结构体和共用体的区别:结构体的各个成员变量会占用不同的内存,互相之间没有影响;而共用体的所有成员变量占用同一段内存,修改一个成员变量会影响其余所有成员变量

#include    

union Data{   // 共用体的成员共享内存空间,该空间的大小以占用最大的成员(int)为准
    int a;
    short b;
};

int main(){
    union Data data;

    printf("内存大小: %d \n", sizeof(data));           // 内存大小: 4

    data.a = 2;
    printf("a = %d, b = %d \n", data.a, data.b);       // a = 2, b = 2

    data.b = 3;
    printf("a = %d, b = %d \n", data.a, data.b);       // a = 3, b = 3

    return 0;
}

你可能感兴趣的:(C语言,C语言)