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

Issue with Assigning of pointer address to pointer

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

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,如果我使用

Out = (float*) Inp;

,而不是 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, int INPLen, float **out, char Case);

你可以在函数中编写

*out = inp;

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