将指针地址分配给指针的问题
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 **
的指针间接传递给函数的原始指针将在函数内更改。
我有如下所示的函数调用:
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 **
的指针间接传递给函数的原始指针将在函数内更改。