您的位置:首页 > 编程语言 > C语言/C++

关于指针在函数中的调用

2014-03-09 12:53 274 查看
2014-2-19

问题:定义函数f(),其形参是float型,现在想通过函数f()调用先前定

义的整型数,通过调试总结出如下一些经验,有的地方尚需要确定。

#include "stdio.h"
#include "stdlib.h"
#define N 8
float Buf
;
unsigned int *Ptr;

void f(float x
)
{
int i;
for(i=0;i
{
x[i]=x[i]*i;
printf("%f\n",x[i]);
}
}

void main(void)
{
int i;
Ptr=NULL; //NULL在文件stdio.h中定义过。
Ptr=(unsigned int *)malloc(N*sizeof(int)); //注意一定是要开辟N个int型的字节长度,不然编译会出错。
//printf("%ld\n",Ptr);
for(i=0;i
{
*(Ptr+i)=i;
}
for(i=0;i
{
Buf[i] = *(Ptr+i);
}

//下面调用函数f 处理外部RAM中的数
f((float *)(Ptr)); //请问:这样调用函数有问题吗?
//f(Buf); //这样调用则不会有问题。
}

说明:若这样调用函数:f((float *)(Ptr)),则输出结果如下图A1:



            A1

若这样调用函数f(Buf),则输出如下图A2所示:



            A2

这说明像f((float *)(Ptr))这样调用函数是有问题的,具体原因就慢慢体会吧,我暂时也不能明确道出个所以然来。

后来我又调试发现:如果存储的时候也是定义Ptr为float型指针的,那么输出时调用f((float *)(Ptr))便可正确输出结果,而存储时是以unsigned
int型指针存储的,则调用的时候应该这样调用:f((*unsigned
int *)Ptr) 。

2014-2-22

对于上述问题,后来我又想到是否可以通过结构体来定义对应的变量,结果还是不行。

#include "stdio.h"
#define N 8
union BufRam
{
unsigned int IntRam;
float FloatRam;
}Buf
;
void f(float x
)
{
int i;
for(i=0;i
{
x[i]=x[i]*i;
printf("%f\n",x[i]);
}
}

void main(void)
{
int i;
for(i=0;i
{
Buf[i].IntRam=i;
}
for(i=0;i
{
//Buf[i].FloatRam=Buf[i].IntRam; //若增加这条语句,则下面的处理即可成功了。
}

//下面调用函数f 处理外部RAM中的数
f(&(Buf[0].FloatRam)); //请问:这样调用函数有问题吗?
}运行结果同上图A1,

若调用程序中的这条语句Buf[i].FloatRam=Buf[i].IntRam,则运行结果同上图A2。

这说明即使是定义结构体类型也是不行的啊,因为整型变量与浮点型变量的存储结构是不同的,这一点是我经过多天的理解自己得出的,其可靠性尚需要确定。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息