我看到有人使用这个
void methodA(const int*& var);
在一个答案中,但无法理解论证的含义。
AFAIK:
const int var
=> const值,不能改变
const int* var
=>指向int的指针,即const,* var无法更改,但var可以更改
const int& var
=>对const的引用,即var的值不能改变
const int*& var
的含义是什么,const int& *var
也是可能的?
你能否举一些例子,比如可以做什么以及用什么不能做?
更新:
我不确定我是否正确思考,但我开始认为引用是作为参数传递的变量的别名,所以 const int * p; methodA(p)=>这里我们将p作为const int *传递但是我们不知道这是通过值传递还是直到我们看到方法A的定义,
所以如果methodA是这样的话 methodA(const int *& p2)==>这里p2是p的另一个名称,即p和p2从现在开始是相同的 如果methodA(const int * p2)==>这里p2作为值传递,即p2只是这个方法的本地,
如果我错误的想法,请纠正我吗?如果是,我可能需要更多地研究这个问题?你能指出一些不错的参考资料吗?更新2 如果像我这样的初学者想要了解更多有关此事的信息,可以使用 c ++ decl / cdecl程序,我刚刚发现它在{{3}中非常有用}
$ c++decl
Type `help' or `?' for help
c++decl> explain const int&* p
declare p as pointer to reference to const int
c++decl> explain const int*& p
declare p as reference to pointer to const int
但正如每个人都指出的那样,第一个例子在C ++中是不合法的。
由于
答案 0 :(得分:28)
它是对指向int的指针的引用。
另一篇文章有点相关,实际上是here。我的回答提供了一种通用的算法来解决这些问题。
这个:const int& *var
没有意义,因为你没有指向引用的指针。
如果const和指针妨碍了,请记住你可以输入这些东西:
typedef int* IntPointer;
typedef const IntPointer ConstIntPointer;
void foo(ConstIntPointer&); // pass by reference
void bar(const ConstIntPointer&); // pass by const reference
void baz(ConstIntPointer); // pass by value
可能更容易阅读。
如果您需要有关C ++的更多帮助,read this。更具体地说,references。
作为变量的引用不占用空间:
int i; // takes sizeof(int)
int*pi = &i; // takes sizeof(int*)
int& ri = i; // takes no space.
// any operations done to ri
// are simply done to i
作为参数的引用使用指针来实现最终效果:
void foo(int& i)
{
i = 12;
}
void foo_transformed(int *i)
{
*i = 12;
}
int main()
{
int i;
foo(i); // same as:
foo_transformed(&i); // to the compiler (only sort of)
}
所以它实际上是在堆栈上传递i
的地址,因此在堆栈上占用sizeof(int*)
空间。但是不要开始考虑引用作为指针。它们不相同。
答案 1 :(得分:8)
有些人发现从右到左更容易阅读。所以
const int *&
是对指向const的整数的指针的引用。
如您所知,不能更改引用,只能更改它们引用的内容。所以引用只引用一个指向const的整数的指针。由于指针不是const - 整数是const - 您可以将指针更改为指向不同的整数。
将此与
进行比较int * const&
这是对指向整数的常量指针的引用。同样,引用是不可变的,在这种情况下,它是对常量指针的引用。在这种情况下你可以改变的是整数值,因为int关键字的任何一边都没有const。
只是为了增加混淆,const int和int const是一样的。但是int const *和int * const是非常不同的。第一个是指向常量整数的指针,因此指针是可变的。第二个是指向整数的常量指针,因此整数是可变的。
希望这有帮助!
答案 2 :(得分:3)
它是对const指针的引用,即指针,您无法修改指向的数据。由于引用用作方法的参数,因此该方法能够修改指针以使其指向其他内容(仍然是无法修改的内容)。
关于您的更新:
所以如果methodA就像这个方法A(const int *& p2)==>这里p2是p的另一个名字,即p和p2从现在开始是相同的,如果methodA(const int * p2)==>这里p2作为值传递,即p2只是本方法的本地
是的,你是对的。
答案 3 :(得分:3)
在您的示例中,var
是指向const char的指针。
由于它是一个引用,methodA()
中的参数更改将反映在传递给methodA()
的参数中:
void methodA( const char*& var)
{
static const char newdata[] = {'a', 'b', 'c', '\0'};
printf( "var points to %s\n", var);
var = newdata;
}
int main()
{
const char * p = "123";
printf( "p points to: %s\n", p); // prints "p points to: 123"
methodA( p);
printf( "now p points to: %s\n", p); // prints "now p points to: abc"
}