结构体指针做为输入型参数和返回参数为结构体指针
结构体指针做为输入型参数和返回参数为结构体指针
- 结构体指针运用
- C的代码其中的原理在代码中有注释
- 运行结果:
结构体指针运用
这个是测试笔记。
C的代码其中的原理在代码中有注释
#include<stdio.h>typedefstruct// 创建一个结构体{intdisk;intfile;}SCFILE;SCFILE*open(void)// 创建一个函数,返回值是结构体指针{SCFILE*hdl=NULL;// 创建一个结构体指针 初始化的时候需要 赋值 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->disk=10;// 给结构体中的元素赋值printf("open 3\n");hdl->file=20;// 给结构体中的元素赋值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){*hdl=open();// 这里直接把返回的指针(即地址值)赋值给传入的指针的地址,那么就把传入指针指向的地方改变了printf("4\n");if(hdl==NULL){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*aa=NULL;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 的地址pHd=hdl;// 把 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(hdl==NULL){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);}