关于指针在结构体中的调用

来源:互联网 发布:宏达软件电话 编辑:程序博客网 时间:2024/06/07 03:52

在学习《数据结构》编程时遇到一些问题,是关于C语言指针的。

这里就没有必要上传整个工程源码了,而只将问题本质总结如下:(若有问题还请各位指正)

typedef struct{int dat;int *ptr;}Sample;Sampletemp;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.dat1245020

temp.dat-858993460

&temp.ptr1245024

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.dat1245020

temp.dat1

&temp.ptr1245024

temp.ptr2

若此时再执行下面四条语句:

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之后,后面的操作与上文类似。

0 0
原创粉丝点击