结构体_C

 

 

// Code file created by C Code Develop

#include "ccd.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
// 结构体
// 为了表达一个数据集
// 人的基本信息 姓名(字符串)、身高(整数)、体重(浮点数)等
// 因为数据要素的数据类型不同不能用一个数组来存放

// 使用结构体来存放一组不同数据类型的数据
/* 
struct 结构体名
{
    结构体成员变量1的声明;
    结构体成员变量2的声明;
    结构体成员变量3的声明;
    。。。  
}; 
*/

// 构造数据类型(定义数据类型)使用时需要 声明具体的变量(即定义变量名)
struct st_girl{
    char name[51];
    int age;
    int height;
    double weight;
}xx; 
// xx是定义的结构体变量类似于int ii的ii,st_girl 是变量类型(类似于int)

int main(int argc, char **argv) 
{   
    //二、 结构体变量
    /*结构体定义变量*/
    struct st_girl queen, waiting;
    
    // 三、占用内存的情况
    memset(&waiting, 0, sizeof(struct st_girl));
    struct st_girl *workers = &waiting;
    printf("sizeof(struct st_girl) %d\n", sizeof(struct st_girl));
    printf("sizeof(xx) %d \n)", sizeof(xx) );
    printf("sizeof(workers) %d \n)", sizeof(workers) );
    printf("sizeof(*workers) %d \n)", sizeof(*workers) );
    
    printf("\n\n" );
    // 四、结构体的变量名
    /*
    结构体的变量名就是变量名,如int ii一样,但又不能直接输出,直接输出没有意义。
    */
    struct st_girl stgirl;
    // printf("stgirl:%p \n", stgirl); // 无意义,且会报错
    printf("&stgirl:%p \n\n", &stgirl);
    
    
    // 五、结构体的初始化
    memset(&queen, 0, sizeof(struct st_girl));
    // 或 metset(queen,0,sizeof(queen));
    
    // 结构体指针 存放传入的结构体地址
    struct st_girl *pst  = &queen;
    printf("&queen:%p \n", &queen);
    printf("pst:%p \n", pst);  // 结构体存放的地址
    printf("&pst:%p \n", &pst);  //结构体的地址
    
    // 指针变量的初始化
    //错误做法。  sizeof(pst)得到的是结构体指针变量 占用内存的字节数
    //     memset(pst, 0, sizeof(pst));
    //正确做法。得到结构体占用内存的字节数
    memset(pst, 0, sizeof(struct stgirl));
    
    
    // 六、成员的访问(结构体的使用)
    /*圆点运算符 访问结构的成员,
    结构体成员变量的使用与普通变量使用相同
    */
    
    struct st_girl girl; //定义结构体变量
    // 初始化结构体变量
    memset(&girl, 0, sizeof(struct girl));
    // 对结构体的每个成员变量赋值
    strcpy(girl.name, "武则天");
    girl.age = 380;
    girl.height = 168;
    girl.weight = 86.00;
    printf("名字:%s \n", girl.name);
    printf("结构体变量girl的地址:%p\n", &girl);
    p_get_struct(&girl); // 怎么用函数传递结构体?//答:法一指针 
    c_get_struct(girl); //答:法二,整个结构体,开销较大
    printf("\n\n");
    
    // *七、结构体数组
    /*结构体可以被定义成数组,
    本质上与其他类型的数组变量没有区别
    */
    struct st_girl princess[6];
    memset(princess, 0, sizeof(struct st_gir) * 6);
    // memset(princess, 0, sizeof(princess));  // 初始化第二种写法
    
    printf("%d\n", sizeof(struct st_girl));
    printf("%d\n\n\n", sizeof(princess));
    //strcpy((princess[0].name, "杨玉环");
    princess[0].age = 18;
    strcpy(princess[1].name, "西施");
    // 实际开发中不常用结构体数组,而常用vector容器
    
    // 🌟八、结构体指针     
    /*结构体是一种自定义的数据类型,
    结构体变量是内存变量
    有内存地址,也就有结构体指针 
    */     
    struct st_girl queen1;
    struct st_girl *pst1 = &queen1;
    memset(pst1, 0, sizeof(*pst1));
    // 定义成员变量时应注意
    // 方法一 * .  星点法
    strcpy((*pst1) .name, "林小涵");
    // 原点的优先级高于 *     
    // 方法二.   箭头   ->
    // 可以通过他直接使用结构体成员
    
    pst1 -> age = 21;
    printf("%s的年龄是:%d\n\n", (*pst1) .name, pst1 -> age);
    
    // 九、结构体的复制     
    // 内存拷贝 memcpy(). memory copy简写 可以复制任何内容、长度 
    // void *memcpy(void *dest, const void *src, size_t n);
    /*参数说明:
    src 源内存变量的起始地址。
    dest 目的内存变量的起始地址。
    n 需要复制内容的字节数。
    函数返回指向dest的地址,函数的返回值意义不大,程序员一般不关心这个返回值。 
    */
    struct st_girl lxh;
    memcpy(&lxh, &queen1, sizeof(struct st_girl));   
    lxh.age = 20;
    // 查看复制后内存是否一致
    printf("lxh.age:%d\n", lxh.age);
    printf("queen1.age:%d\n", queen1.age); 
    //进一步探究,内存地址
    printf("复制出来结构体lxh的地址:   %p\n", & lxh);
    printf("被复制的结构体queen1的地址:%p\n\n", &queen1); 
    
    // 十、结构体作为函数的参数
    // 见六
    
    
    
    return 0;
}


void p_get_struct(struct st_girl *c) {
    // 传进来结构体变量的地址,减小开销
    printf("年龄: % d\n", (*c) .age);     //方法1、访问成员变量
    printf("体重: % f\n", c -> weight);   //方法2、访问成员变量
    printf("指针存的地址: % p\n", c);
    printf("------------------------\n");
} 
void c_get_struct(struct st_girl c) {
    // 传进来整个结构体,开销较大
    printf("年龄: % d\n", c.age);
    printf("体重: % f\n", c.weight);
    printf("c的地址: % p\n", &c);
    printf("------------------------\n");
} 

 

posted @ 2021-09-26 21:38  def_Class  阅读(44)  评论(0编辑  收藏  举报