结构体_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"); }
本文来自博客园,转载请注明原文链接:https://www.cnblogs.com/WG11/p/15340224.html,作者:def_Class