这意味着什么是const int *& VAR?

时间:2009-08-10 22:10:43

标签: c++

我看到有人使用这个

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 ++中是不合法的。

由于

4 个答案:

答案 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"
}