2014-03-25 52 views
0

如果我不清楚這個問題,請看下面的代碼。爲什麼用字符測試而不是用整數測試呢?字符串和數組之間的這種根本區別是什麼,我很難找到我的頭腦?爲什麼我可以通過引用調用字符串文字而不是數組?

using namespace std; 

void fun(int &x) 
{ 
    cout << x << " okk" << endl; 
} 

void test (int* &a, int* &b) { 
    int* temp = a; 
    a = b; 
    b = temp; 
    //cout << *a << " " << &a << endl; 
} 

void test (char* &a, char* &b) { 

    cout << &a << " " << &b << endl; 
    char * temp = a; 
    a = b; 
    b = temp; 
    //cout << *a << " " << &a << endl; 
} 

int main() 
{ 
    char *s = "help"; 
    char *t = "me"; 

    char *u = "help"; 

    cout << s << " " << t << " " << u << endl; 

    /*char *temp = s; 
    s = t; 
    t = temp; 
    */ 

    test (s,t); 

    cout << s << " " << t << endl; 

    int a[10] = {1,2,3,4,5,6,7,8,9,10}; 
    int b[10] = {11,12,13,14,15,16,17,18,19,20}; 

    cout << *a << " " << *b << endl; 

    test (a,b); 

    cout << *a << " " << *b; 

} 
+0

你爲什麼要打印的char *的的地址? – cppguy

回答

2

int[]不是int*,所以你不能傳遞一個int[]其中一個int*&參考預期。但是,int[]確實會降級爲int*指針,因此您可以傳遞int[],其中int*是預期的。參考文獻&有很大的不同。當您通過引用傳遞某些內容時,某些內容必須與引用所引用的數據類型相匹配。

0

我假設你的意思是:「爲什麼我可以通過引用傳遞字符串,而不是數組」。

那麼,這個問題是有缺陷的,因爲你實際上可以通過引用傳遞一個數組。你也可以通過引用來傳遞字符串,但是你的代碼並沒有這樣做。您的代碼通過引用傳遞指針。

void test (char* &a, char* &b) 

此功能通過參考帶有兩個指針爲char(char*)。

test (s,t); 

stchar*(不是字符串文字),所以這是一個正確的調用。其他測試功能:

void test (int* &a, int* &b) 

即也通過引用採取指針(爲int)。但是你試圖傳遞數組,而不是指針。作爲參考,傳遞字符串(這是const的字符數組)的功能應該是這樣的:

test("help","me") 

而且不會與你有電流過載編譯。

+0

好的。我明白了。但是,這是如何有效? 無效美孚(INT * A){ } INT主(){ INT一個[10]; (a); } – shrinidhisondur

+0

@ user2910606:因爲'foo'按值取指針,所以它可以接受r值指針。數組衰減爲r值指針。但'test'函數通過非const引用引用它的參數,這需要一個l值。 –

+0

非常感謝。我現在明白了。 – shrinidhisondur

0

第一炭萬一你

  1. 實例化一個字符串的只讀存儲器
  2. 創建指針(不是數組)指向有
  3. 問計於一個參考兩個參數的指針

所以沒有問題。

在INT萬一你

  1. 創建整數
  2. 數組傳遞給需要一個指針引用int的函數的數組。

數組名常說有一個明確的指針通過兩種當直接腐朽功能。你的函數需要的是陣列已經被傳遞給函數之前腐朽爲指針。

在綜合中,您需要在詢問參考時事先匹配簽名的類型。

+0

非常感謝你的回答。在你回答之後,我查看了陣列衰變,並清除了我所擁有的許多東西。 – shrinidhisondur

0

在第一種情況下,你使用指針

char *s = "help"; 
char *t = "me"; 

,因爲他們不是恆定的,你可能會改變他們的價值。

要考慮到字符串字面量有不斷類型數組。比如你嘗試調用

test ("help", "me"); 

,你會得到一個編譯錯誤,如下面考慮第二種情況。

在第二種情況下,您試圖將對數組的引用轉換爲對指針的引用。沒有這種隱式和/或顯式的轉換。所以編譯器會發出錯誤。

你可以達到同樣的效果在第一種情況下,如果你會寫

int *p = a; 
int *q = b; 

swap(p, q); 
相關問題