C知识回顾(二)

本案例代码非原创 , 我只是按照学习的过程自己重敲一遍回顾学习!
2.结构体介绍

#include 

// 创建一个结构体:
struct Student {
    int no;
    char name[20];
    int *age;
    // 初始化结构体:
    Student() {
        no = 114;
        // 数组赋值:stringCopy , 给name属性赋值 "Snow":
        strcpy(name, "Snow");  // 数组的一种赋值方式:
        // 用 new 关键字开辟一块 int类型的 内存空间给 age 这个结构体成员 , 分配int型空间,放入内容为数字20,并将首地址给指针age:
        age = new int(20);
    }
};

/**
 *  1.定义一个Student1结构体 (只有结构体名称)
 *
 */
struct Student1:Student{
    
};


/**
 *  2.定义一个结构体变量stu2 (只有底部的 `结构体变量` 名称)
 *
 */
struct:Student{
    
}stu2;

/**
 *  3.定义一个Student3结构体和一个结构体变量stu3 (有顶部的结构体名称 , 也有底部的结构体变量名称)
 *
 */
struct Student3:Student{
    
}stu3;

/**
 *  定义一个 继承自 Student 结构体 结构体名称为 Student4 的结构体,并给它取个别名叫 `Stu4`
 *  Stu4这个结构体 就代表了 `struct Student4`这个结构体
 */
typedef struct Student4:Student{
    
}Stu4;

int main(int argc, const char * argv[]) {
    /**
     *  访问结构体
     *
     */
    //1.第一种
    printf("第一种\n");
    struct Student1 stu1;
    // 取数值:
    printf("stu1.no: %d\n",stu1.no);
    // 指针偏移 , 数组是在内存中一段连续开辟的内存空间:
    // 取数组中的值:用指针取值 , 拿到的是第一个字符串 l 的指针位置 , 然后用 * 号取值:
    printf("sut1.name: %c %c %c %c %c \n",*(stu1.name) , *(stu1.name+1) , *(stu1.name+2) , *(stu1.name+3) , *(stu1.name+4));
    printf("stu1.age: %d\n",*(stu1.age));
    
    //2.第二种
    printf("第二种\n");
    // 用结构体变量名直接取值 , 如果是第一种结构体名称还需要创建结构体变量才能取值 , 第二种是直接就有结构体变量名称取值!
    printf("stu2.no: %d\n",stu2.no);
    
    //3.第三种 (结构体名称 , 结构体变量名称都有 , 就可以综合第一种第二种两种方法取值)
    printf("第三种\n");
    struct Student3 stu33;
    // 类似第一种用自己新创建的结构体变量取值:
    printf("stu33.no: %d\n",stu33.no);
    // 类似第二种用结构体变量取值:
    printf("stu3.no: %d\n",stu3.no);
    
    //4.第四种
    // 直接用别名代替  `struct Student4`:
    Stu4 stu4;
    // 类似第一种创建方式:
    struct Student4 stu44;
    printf("stu4.no: %d\n",stu4.no);
    printf("stu44.no: %d\n",stu44.no);
    
    /**
     *结构体指针
     */
    Stu4 *pStu4 = &stu4;
    printf("pStu4->no: %d\n",pStu4->no);
    
    /**
     *结构体位域  8位=1字节  4-->00000100
     */
    struct Tutor{
        // 创建一个成员a , 占用 `1位`:
        unsigned int a:1;
        // 创建一个成员b , 占用 `2位`:
        unsigned int b:2;
        // 创建一个成员c , 占用 `3位`:
        unsigned int c:3;
    }   tc , *ptc;  // 这里定义了两个变量 , 一个是结构体变量tc , 一个是结构体指针变量ptc , 这个ptc只是一个Tutor类型的结构体指针还没有被赋值 !
    
    // int类型占用四字节 , Tutor这个结构体三个成员虽然只占用了1 , 2 , 3 一共 `6位` 但是为了内存空间对齐 , 也会给他分配至少 `4个字节` 的内存空间:
    printf("%lu\n",sizeof(Tutor));        //打印结果为4字节
    // 给ptc赋 tc de 地址值:
    ptc = &tc;
    // 通过结构体指针给结构体成员赋新值:
    ptc->a = 1;             //1
    // 注意 , 这里不能赋值超过3的数字, 因为 4 是0000 0100 已经占用了3位了 , 这跟结构体创建成员b时候给了 `2字节` 的限制就相左了!!
    ptc->b = 3;             //11
    ptc->c = 5;             //101               最大长度111=7
    printf("Tutor->a: %u\n",ptc->a);
    printf("Tutor->b: %u\n",ptc->b);
    printf("Tutor->c: %u\n",ptc->c);
    return 0;
}

愿编程让这个世界更美好

你可能感兴趣的:(C知识回顾(二))