C/C++ 如何在一次函数调用中交出 const 函数指针或简单指针

C/C++ How to hand over a const function pointer or a simple pointer in one function call

本文关键字:指针 函数调用 函数 简单 一次 const C++      更新时间:2023-10-16

我有一个函数(func1),它获取一个常量指针作为参数。 此指针的值用于第二个函数 (func2)。 根据布尔值,我想在是否将其交给 func2 之前修改此值。如果我必须修改它,我会分配新的内存来存储它的修改版本。因为实际上 const int 指针是一个大数组,我不想复制它。 我试图以这种方式解决它:

void func1(const int* value, bool change)
{
int* valueToUse;
if(change)
{
int changedValue = (*value)++;
valueToUse = &changedValue;
}
else
{
valueToUse = value;  // <= here the Error occurs
}
func2(valueToUse);
}
void func2(const int* foo)
{
// ...
}

但是如果我这样做,我会收到一个错误,因为我将一个 const 指针分配给一个简单的指针:

错误:从"const int* 到 int*"的转换无效

有什么简单的方法可以解决这个问题吗?

我可以想象一个解决方案,每种情况有两个额外的函数,或者一个在两个点调用func2的版本。但是因为这个呈现的代码只是我真实代码的一个非常简化的版本,所以如果有更简单的解决方案,我会徘徊。

最好是适用于 C 和 C++ 的解决方案。

提前感谢大家!

这有效吗?

void func1(const int* value, bool change)
{
const int* valueToUse;
int changedValue;
if(change)
{
changedValue = (*value) + 1;
valueToUse = &changedValue;
}
else
{
valueToUse = value;
}
func2(valueToUse);
}

const int*是指向const int的指针,而不是指向intconst指针。因此,指针本身可以自由更改。

此外,递增(*value)是一个错误,因为*value是一个const int

在 func1 中,您可以对 func2 进行 2 次调用,这样在不需要时没有副本,并且永远不会更改原始值:

void func1(const int* value, bool change)
{
if(change)
{
int changedValue = *value+1;
func2(&changedValue);
}
else
{
func2(value);
}
}
void func1(const int* value, int change)
{
int* valueToUse;
if(change)
{
(*(int*)value)++;
valueToUse = (int*)value;
}
else
{
valueToUse = (int*)value;  // <= here the Error occurs
}
func2(valueToUse);
}

但是你真的不需要这个valueToUse,这就是我的想法,所以。

void func1(const int* value, int change)
{
if(change)
(*(int*)value)++;
func2(value);
}
const int* value

这意味着指向常量 intvalue的指针。不允许更改常量 int 的值。 有两种方法可以解决这个问题。

  1. 更改第一个函数void func1(int* value, bool change)的签名
  2. 使用const_cast和更改进行常量强制转换后将参数传递给 func1int changedValue = (*value)++;int changedValue = *value + 1;

好吧,运行此代码我只收到一个警告,尽管我认为类型转换会对您有所帮助。

valueToUse = (int*)value;