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

时间:2020-08-29 11:23:11

标签: c pointers pass-by-reference function-declaration

我有如下所示的函数调用:

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还有其他方法吗?

2 个答案:

答案 0 :(得分:0)

在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 **

答案 1 :(得分:0)

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

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

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

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

void funCall(float *inp, int INPLen, float **out, char Case);

并且您可以在函数中编写

*out = inp;

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