微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将指针地址分配给指针的问题

如何解决将指针地址分配给指针的问题

我有如下所示的函数调用

void funCall(float *inp,int INPLen,float *out,char Case)
{
   if(case == 0)
   {
      memcpy(out,inp,INPLen*4);
   }
   else if(case == 1)
   {
      // Out will be result of arithmetic operations on **inP** 
       variable.
   }
}

在情况0中,如果我使用

输出=(浮点*)输入;

代替 memcpy ,变量 Out 仅在函数内部保存输入值。是什么原因呢?

除了memcpy还有其他方法吗?

解决方法

在C参数中,通过值传递参数。这意味着它们实际上是用于调用该函数的变量的副本。对它们执行的任何修改都会在功能之外丢失(这正是您所经历的)。

如果所需的行为是对参数的修改,则必须使用指针。因此,如果您需要修改int,请将其地址(将为int *)传递给函数。

在您的情况下,您想要修改指针(float *),因此需要传递双指针float **)。

因此,只需将out更改为float **

void funCall(float *inp,int INPLen,float **out,char Case)
{
   if(case == 0)
   {
      *out = inp;
   }
   else if(case == 1)
   {
      // modify accordingly the way you access out
   }
}

当然,您调用此函数的方式也会改变。举个例子:

float in[3] = { 0.3,3.45,6.789 };
float *output;

funcall(in,3,&output,0);

因此,传递output的地址float *,我们得到一个float **

,

函数参数是函数局部变量,通过用作参数的变量值的副本进行初始化。

因此,在函数内更改了局部变量out,该变量由作为参数传递给函数的指针的值初始化。原始指针未更改,因为该函数处理的是分配给指针out的值的副本。

要更改对象,您需要通过指向它的指针间接通过引用传递它。

这就是你的函数可以这样声明

void funCall(float *inp,char Case);

并且您可以在函数中编写

*out = inp;

在这种情况下,通过类型out间接指向函数float **的指针传递给函数的原始指针将在函数内更改。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。