结构体指针做为输入型参数和返回参数为结构体指针

发布时间:2026/7/30 16:56:58

结构体指针做为输入型参数和返回参数为结构体指针 结构体指针做为输入型参数和返回参数为结构体指针结构体指针运用C的代码其中的原理在代码中有注释运行结果结构体指针运用这个是测试笔记。C的代码其中的原理在代码中有注释#includestdio.htypedefstruct// 创建一个结构体{intdisk;intfile;}SCFILE;SCFILE*open(void)// 创建一个函数返回值是结构体指针{SCFILE*hdlNULL;// 创建一个结构体指针 初始化的时候需要 赋值 NULL避免野指针printf(open star 1\n);hdl(SCFILE*)malloc(sizeof(SCFILE));// 给指针分配指向的地址printf(hdl value %p\n,hdl);// 直接打印 hdl 表示该指针的指向的地址 即该结构体指针存的值printf(*hdl value %d\n,*hdl);// *p 表示的指针进行解引用 由于结构体的存储特性直接 *hdl 表示结构体中的第一个元素的值printf(hdl value %p\n,hdl);// 表示该结构体指针的地址printf(open 2\n);hdl-disk10;// 给结构体中的元素赋值printf(open 3\n);hdl-file20;// 给结构体中的元素赋值printf(open 4\n);printf(*hdl value %d\n,*hdl);// 第一个元素的值printf(hdl value %p\n,hdl);// 结构体指针里指向的地址即该结构体指针存的值printf(hdl value %p\n,hdl);// 该结构体指针的地址printf(open end\n);returnhdl;}// 使用二重指针 // 直接传入指针的地址intfffopen(SCFILE**hdl){*hdlopen();// 这里直接把返回的指针即地址值赋值给传入的指针的地址那么就把传入指针指向的地方改变了printf(4\n);if(hdlNULL){printf(sAPI_fopen err\r\n);return-1;}printf(5\n);printf(hdl-disk %d\n,(*hdl)-disk);printf(hdl-file %d\n,(*hdl)-file);return0;}intfffopen1(SCFILE*hdl){int*aaNULL;SCFILE*pHd(SCFILE*)malloc(sizeof(SCFILE));printf(sizeof(pHd) %d\n,sizeof(pHd));// 可以测出不管什么类型的指针其大小都是一样的我的这里是 4字节和运行的机器位数有关printf(sizeof(aa) %d\n,sizeof(aa));printf(hdl value %p\n,hdl);// hdl 存储的地址值printf(*hdl value %d\n,*hdl);// hdl 第一个元素的值printf(hdl addr %p\n,hdl);// hdl 的地址printf(\n);printf(pHd value %p\n,pHd);// phd 存储的值printf(*hdl value %d\n,*pHd);// pHd 第一个元素的值printf(pHd addr %p\n,pHd);// pHd 的地址pHdhdl;// 把 hdl 中存储的地址值赋值给 pHd 即pHd 指向了那个地址printf(4\n);printf(hdl value %p\n,hdl);// hdl 存储的地址值printf(*hdl value %d\n,*hdl);// hdl 第一个元素的值printf(hdl addr %p\n,hdl);// hdl 的地址printf(\n);printf(pHd value %p\n,pHd);// phd 存储的值printf(*hdl value %d\n,*pHd);// pHd 第一个元素的值printf(pHd addr %p\n,pHd);// pHd 的地址*pHd*open();// 把open函数返回的赋值给 pHd open返回的是结构体指针 加上* 表示解引用 即把两边的解引用出来赋值给新的因为新的也指向传入的地址//pHd open(); //如果写成这种是无法通过输入型参数把值返回的因为这样表示返回的指针赋值即另外一个地址给另外一个指针传入的就无法改变printf(5\n);printf(hdl value %p\n,hdl);// hdl 存储的地址值printf(*hdl value %d\n,*hdl);// hdl 第一个元素的值printf(hdl addr %p\n,hdl);// hdl 的地址printf(\n);printf(pHd value %p\n,pHd);// phd 存储的值printf(*hdl value %d\n,*pHd);// pHd 第一个元素的值printf(pHd addr %p\n,pHd);// pHd 的地址if(hdlNULL){printf(sAPI_fopen err\r\n);return-1;}printf(6\n);printf(hdl-disk %d\n,pHd-disk);// 由于 pHd 和 hdl 指向的地址是同一块所以打印出的是一样的printf(hdl-file %d\n,pHd-file);printf(hdl-disk %d\n,hdl-disk);printf(hdl-file %d\n,hdl-file);return0;}voidmain(void){#if0SCFILE*hdl(SCFILE*)malloc(sizeof(SCFILE));printf(11\n);printf(hdl value %p\n,hdl);// hdl 存储的地址值printf(*hdl value %d\n,*hdl);// hdl 第一个元素的值printf(hdl addr %p\n,hdl);// hdl 的地址printf(1111\n);if(fffopen(hdl)-1){printf(error);}#elseSCFILE*hdl(SCFILE*)malloc(sizeof(SCFILE));printf(11\n);printf(hdl value %p\n,hdl);// hdl 存储的地址值printf(*hdl value %d\n,*hdl);// hdl 第一个元素的值printf(hdl addr %p\n,hdl);// hdl 的地址printf(1111\n);if(fffopen1(hdl)-1){printf(error);}#endifprintf(OK\n);printf(hdl-disk %d\n,hdl-disk);printf(hdl-file %d\n,hdl-file);}运行结果

相关新闻