【问题标题】:Issue with Assigning of pointer address to pointer [duplicate]将指针地址分配给指针的问题[重复]
【发布时间】:2020-08-29 11:23:11
【问题描述】:

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

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

【问题讨论】:

  • out 是一个局部变量。更改它不会更改调用者的值。试试*out = *inp

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    函数参数是函数局部变量,由用作参数的变量值的副本初始化。

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

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

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

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

    在函数内你可以写

    *out = inp;
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-23
      • 2015-06-11
      • 1970-01-01
      • 2021-01-18
      • 2013-12-10
      相关资源
      最近更新 更多