2009-08-10 129 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是非常不同的。第一個是一個指向常量整數的指針,所以指針是可變的。第二個是一個指向整數的常量指針,所以整數是可變的。

希望這會有所幫助!