2009-08-10 120 views
19

我看到有人在一个答案用这个这是什么意思const int *&var?

void methodA(const int*& var); 

,但不明白的说法是什么意思。

AFAIK:

  • const int var =>不能被改变

  • const int* var =>指针为int是常量,即*变种不能被改变,但变种可以是常数值改变

  • const int& var =>参考const int的即变种的值不能被改变

是什么意思const int*& var,并const int& *var也可能吗?

能否请您举一些例子还有,像什么可以做,什么不能用它做?

UPDATE:

我不知道如果我想正确的方式,但我开始想引用因为这是通作为参数变量的别名,所以 const int的* p; 了methodA(P)=>在这里我们通过数p作为const int的*,但我们不知道这是否是按值传递还是什么,直到我们看到方法的定义,

所以如果了methodA是这样 了methodA( const int的* & P2)==>在这里p2的另一个名字为p,即p和p2是相同的,从现在开始 如果了methodA(const int的* P2)==>这里P2作为价值即p2的传递只是局部这种方法,

如果我想错误的方式,请纠正我?如果是的话,我可能需要进一步研究一下这个?你能指出一些很好的参考吗?

更新2 如果像我这样的初学者一些想知道更多关于这件事,你可以使用C++东方电气/CDECL程序,我只是发现非常有用从here

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

由于

回答

26

这是一个指针的引用为int是常量。

还有一个帖子有点相关,实际上,here。我的答案给出了一些通用算法来解决这些问题。

这个:const int& *var没有意义,因为你不能有指向引用的指针。

如果常量的和指针的方式获得,记住你可以的typedef这些东西:

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*)。但不要开始考虑引用作为指针。他们是不是一样。

+0

第三种方法baz,ConstIntPointer == const int * var,这是怎么传值的,还有指针参与?我现在很困惑。 – 2009-08-10 22:20:32

+0

指针自己需要空间。指针是存储另一个变量地址的变量。它将复制该值,将其推入堆栈并调用该函数。 – GManNickG 2009-08-10 22:22:21

+0

您正在传递存储在指针中的值(即内存地址)。 – 2009-08-10 22:22:50

3

它是对const指针的引用,即指向你无法修改指向的数据的指针。由于引用被用作方法的参数,因此该方法能够修改指针以使其指向其他内容(仍然是无法修改的内容)。

至于您的更新:

所以如果是了methodA这样了methodA(const int的* & P2)==>在这里p2的另一个名字为p,即p和p2是从现在开始同如果了methodA(const int的* P2)==>这里P2作为价值即p2的传递只是局部的这种方法

是的,你是正确的。

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" 
} 
6

有些人觉得它更容易阅读的这一从右到左。所以

const int的* &

是一个指针引用一个整数,它是常量。

如您所知,参考文献无法更改,只有它们所指的文献可以更改。所以引用只会引用一个指向const的整数的指针。由于指针不是const - 整数是const - 你可以改变指针指向一个不同的整数。

比较这对

INT * const的&

这是一个常量指针的引用的整数。再次引用是不可变的,在这种情况下,它是对常量指针的引用。在这种情况下你可以改变的是整数值,因为int关键字的任何一端都没有const。

只是为了增加混淆,const int和int const是相同的。但是int const *和int * const是非常不同的。第一个是一个指向常量整数的指针,所以指针是可变的。第二个是一个指向整数的常量指针,所以整数是可变的。

希望这会有所帮助!