本文主要是介绍关于指针在结构体中的调用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在学习《数据结构》编程时遇到一些问题,是关于C语言指针的。
这里就没有必要上传整个工程源码了,而只将问题本质总结如下:(若有问题还请各位指正)
typedef struct
{int dat;int *ptr;
}Sample;Sample temp;printf("%d\n",&temp.dat); //输出temp.dat的地址
printf("%d\n",&temp.ptr); //输出temp.ptr的地址
printf("%d\n",temp.dat); //输出temp.dat中存放的数值,该数值就是一个普通数值。
printf("%d\n",temp.ptr); //输出temp.ptr中存放的数值,该数值也是一个地址,但是是默认分配的地址,未被初始化。
执行结果如下:
下面开始分析。
为便于分析,可将上述执行结果总结在下表中:
&temp.dat:1245020 | temp.dat:-858993460 |
&temp.ptr:1245024 | temp.ptr:-858993460 |
下面两条语句都不正确:
printf("%d\n",*temp.dat); //非法的,因为dat并非指针变量
printf("%d\n",*temp.ptr); //编译无错,但是执行时会出错,因为此时指针ptr没有被初始化,它不指向任何内存,temp.ptr中存放的是默认的数值-858993460。而*temp.ptr是取指针变量所指存储空间的内容,暂时就认为-858993460所指存储空间并不存在或者该存储空间的内容不可取,具体原因也许哪一天会通过别的渠道得知。
若执行下面两条语句:
scanf("%d",&temp.dat);
scanf("%d",&temp.ptr);
比如说执行时输入1和2,则上表变内容变成如下所示:
&temp.dat:1245020 | temp.dat:1 |
&temp.ptr:1245024 | temp.ptr:2 |
若此时再执行下面四条语句:
printf("%d\n",&temp.dat); //输出temp.dat的地址,当然还是1245020
printf("%d\n",&temp.ptr); //输出temp.ptr的地址,当然还是1245024
printf("%d\n",temp.dat); //输出temp.dat中存放的数值1,该数值就是一个普通数值
printf("%d\n",temp.ptr); //输出temp.ptr中存放的数值2,该数值是一个地址,即地址单元为2存储空间。
地址为2的存储单元一般是不可写也不可读的。
比如在执行语句scanf("%d",temp.ptr)和语句printf("%d\n",*temp.ptr)时都是错误的,但当temp.ptr指向了确定的存储空间时,这两条语句便是正确的了。
若执行语句 temp.ptr = (int *)malloc(sizeof(int)) 后,再执行scanf("%d",temp.ptr)和printf("%d\n",*temp.ptr),就是可以的了,因为此时temp.ptr执向一个确定的存储空间,该存储空间是由malloc函数分配的。
上面所有的分析都是基于定义了Sample temp,即定义了Sample类型的变量temp,倘若要是定义Sample类型的指针变量*temp呢?
若定义的是Sample类型的指针变量*temp,则也要对其初始化,使其指向一个确定的存储空间,否则temp自己都不指向确定的存储空间,更别说temp下的dat和ptr了。
初始化方式如下(也可叫作分配存储空间):
temp = (Sample *)malloc(sizeof(Sample));
在初始化后,便可操作temp结构了,但要注意此时的temp.ptr并没有初始化,它并没有指向任何确定的存储空间,temp.ptr的初始化方式在前面已经说了。
在初始化temp之后,后面的操作与上文类似。
这篇关于关于指针在结构体中的调用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!