2013-10-27 32 views
0

下面給出的程序有一些疑問。任何討論將有助於理解內部。爲什麼char *和int *的行爲不同

#include <iostream> 
using namespace std; 

int main() { 
    // your code goes here 

    char* ptr = new char[11]; 
    ptr = "helloworld"; 
    cout << ptr; 

    int* ptr1 = new int[2]; 
    //ptr1 = {12, 24}; 
    cout << ptr1; 

    return 0; 
} 
  1. COUT < < PTR;打印helloworld(打印值); cout < < ptr1打印地址不值。爲什麼??
  2. 因爲cout < < ptr;打印值,如何獲取新char [11]分配給ptr的地址。
  3. If ptr =「helloworld」;被允許。爲什麼ptr1 = {12,24};不允許?
+3

1.因爲'const char *'有一個單獨的重載,因爲它通常表示字符串。 2.投射到'(void *)'。 3.因爲標準是這樣說的。 – 2013-10-27 15:21:35

+2

'ptr =「helloworld」;'也是不允許的,因爲'ptr'是'char *'。 – Nawaz

+0

@Nawaz爲什麼不允許。 ptr是char *,而「helloworld」是char數組,所以有什麼問題?你可以在這裏查看。 http://ideone.com/QsqKrN允許。 –

回答

5

問題的核心是爲什麼運算符在一種情況下輸出字符串,而在另一種情況下輸出地址。這是來自它的c語言遺產,那裏沒有'真正'的字符串類型。在c/C++中,char *和char []是唯一處理的,通常被認爲是一個'字符串'。其他類型的數組被假定爲該類型的數組。所以當輸出一個char *時,< <假設你想要一個字符串輸出,而使用int [],它輸出數組的地址而不是它的內容。簡單地說,char []和char *在很多輸出函數中被視爲特殊情況。

我可以看到你對編譯器處理源代碼的方式也有一些困惑。考慮:

char* ptr = new char[11]; 
ptr = "helloworld"; 

此代碼分配11個字符的內存並將ptr設置爲該分配的地址。下一行創建一個常量「helloworld」,它被分配並初始化,並將ptr設置爲該內存的地址。你有兩個內存位置,一個有11個未初始化的字符,一個初始化爲「helloworld \ 0」。

+0

非常感謝你的解釋。這正是我一直在尋找的:) –

0

您的代碼有一個主要問題,那就是內存泄漏。您分配內存並將其分配給ptr,但您然後重新分配它使其指向其他地方。如果你想要內存包含一個字符串,你必須將其複製到分配的內存中。

除了在聲明中初始化數組時,語法不允許使用「文字數組」。

+3

雖然這是真的(而且很重要),但它沒有解決上述任何問題。 – 2013-10-27 15:22:58

+0

@joachim 是重新分配它使其指向別的地方?是ptr =「helloworld」;不等於 ptr [0] ='h' ptr [1] ='e' ptr [2] ='1' 。 。 。 –

+0

@DeveshAgrawal爲什麼它會相當?指針不是數組。 – 2013-10-27 15:36:29

相關問題