关于指针在函数中的调用

2014-2-19

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

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

#include "stdio.h"
#include "stdlib.h"
#define N 8
float Buf[N];
unsigned int *Ptr;
 
void f(float x[N])
{
   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))这样调用函数是有问题的,具体原因就慢慢体会吧,我暂时也不能明确道出个所以然来。

后来我又调试发现:如果存储的时候也是定义Ptrfloat型指针的,那么输出时调用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[N];
void f(float x[N])
{
   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。

这说明即使是定义结构体类型也是不行的啊,因为整型变量与浮点型变量的存储结构是不同的,这一点是我经过多天的理解自己得出的,其可靠性尚需要确定。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值