当作为函数参数传递时,为什么我不能更改类型为“const int *”的指针的地址?
Why can't I change address of a pointer of type `const int *` when passed as function argument?
据我所知,const int *
表示我可以更改指针但不能更改数据,int * const
表示我无法更改指针地址但可以更改数据,并且 const int * const
声明我无法更改其中任何一个。
但是,我无法更改用类型 const int *
定义的指针的地址。这是我的示例代码:
void Func(const int * pInt)
{
static int Int = 0;
pInt = ∬
Int++;
}
int wmain(int argc, wchar_t *argv[])
{
int Dummy = 0;
const int * pInt = &Dummy;
//const int * pInt = nullptr; // Gives error when I try to pass it to Func().
std::cout << pInt << '\t' << *pInt << std::endl;
std::cout << "-------------------" << std::endl;
for (int i=0; i<5; i++)
{
Func(pInt); // Set the pointer to the internal variable. (But, it doesn't set it!)
std::cout << pInt << '\t' << *pInt << std::endl;
}
return 0;
}
代码输出:
00D2F9C4 0
-------------------
00D2F9C4 0
00D2F9C4 0
00D2F9C4 0
00D2F9C4 0
00D2F9C4 0
我希望 pInt
的地址在调用 Func()
至少一次后更改为指向 Func()
函数内的内部变量。但事实并非如此。我一直指向 Dummy
变量。
这里发生了什么?为什么我没有得到我期望的结果?
(IDE: Visual Studio 2015 社区版)
您没有在调用站点看到更改,因为您是按值传递指针。在Func
里面修改只会改变本地副本,不会改变传入的指针。
如果要修改指针并使更改在外部可见,请通过引用传递它:
void Func(const int *& pInt)
// ^
据我所知,const int *
表示我可以更改指针但不能更改数据,int * const
表示我无法更改指针地址但可以更改数据,并且 const int * const
声明我无法更改其中任何一个。
但是,我无法更改用类型 const int *
定义的指针的地址。这是我的示例代码:
void Func(const int * pInt)
{
static int Int = 0;
pInt = ∬
Int++;
}
int wmain(int argc, wchar_t *argv[])
{
int Dummy = 0;
const int * pInt = &Dummy;
//const int * pInt = nullptr; // Gives error when I try to pass it to Func().
std::cout << pInt << '\t' << *pInt << std::endl;
std::cout << "-------------------" << std::endl;
for (int i=0; i<5; i++)
{
Func(pInt); // Set the pointer to the internal variable. (But, it doesn't set it!)
std::cout << pInt << '\t' << *pInt << std::endl;
}
return 0;
}
代码输出:
00D2F9C4 0
-------------------
00D2F9C4 0
00D2F9C4 0
00D2F9C4 0
00D2F9C4 0
00D2F9C4 0
我希望 pInt
的地址在调用 Func()
至少一次后更改为指向 Func()
函数内的内部变量。但事实并非如此。我一直指向 Dummy
变量。
这里发生了什么?为什么我没有得到我期望的结果?
(IDE: Visual Studio 2015 社区版)
您没有在调用站点看到更改,因为您是按值传递指针。在Func
里面修改只会改变本地副本,不会改变传入的指针。
如果要修改指针并使更改在外部可见,请通过引用传递它:
void Func(const int *& pInt)
// ^