2011-10-07 62 views
0

我已經測試的與之相似代碼的兩個不同varianat不同類型的陣列,假設我有字符數組不同的行爲與

char x[]="snow comes in winter "; 

然後下面的代碼

#include <iostream> 
#include <string.h> 
using namespace std; 
int main(){ 

char x[]="snow comes in winter "; 
int k=0; 
int n=3; 
cout<<x+n-k+1<<endl; 
    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 

打印"comes in winter " 而以下

#include <iostream> 
#include <string.h> 
using namespace std; 
int main(){ 

//char x[]="snow comes in winter "; 
int a[]={12,3,2,4,5,6,7}; 
int k=0; 
int n=3; 
cout<<a+n-k+1<<endl; 



return 0; 
} 

打印0xbffd293c 如果我們改變了一點

#include <iostream> 
#include <string.h> 
using namespace std; 
int main(){ 

//char x[]="snow comes in winter "; 
int a[]={12,3,2,4,5,6,7}; 
int k=0; 
int n=3; 
cout<<*(a+n-k+1)<<endl; 



return 0; 
} 

打印數量5. 所以我的問題是,爲什麼我們可以在字符數組的情況下訪問這麼容易?什麼是它的主要原因是什麼?我很curiousy並請可能有人請解釋一下?

+0

你能澄清你的問題嗎? – Griwes

+0

ok爲什麼它顯示出不同類型的數組的不同結果?(在這種情況下,給出了char和integer數組) –

回答

9

爲什麼我們可以輕鬆訪問char數組的情況?

因爲有一個約定,C字符串表示爲char*,所以人們認爲char*實際上是字符串。 iostream跟着那個和char*的過載輸出來打印字符串,而int*(在你的第二個例子中),它們打印地址的表示。

順便說一句,有一個類似的輸入過載,這是最不幸的,因爲你不能控制,以防止緩衝區溢出。即。不這樣做:

char x[10]; 
std::cin >> x; 
+2

您可以在'iostream'(或者更準確地說,在'ostream')中查看它,無論哪種C++您正在使用的標準庫,並驗證這是否適用於您自己。 – jelford

2

這種情況的原因回到C.

在C,char*被通常用於表示一個NUL終止的字符串(而不是一個指向個別char )。因此,採用char*的函數通常將參數視爲字符串。在這種情況下,函數是operator<<,它所做的是將參數作爲字符串輸出。

對於int*沒有這樣的事情可以說,這就是指向int的指針。這裏,operator<<輸出指針的值(即地址)。只有當你明確地解引用指針指向的值時纔會打印。

1

cout的左移運算符被重載以處理字符指針。意思是,當你給它一個指向字符的指針時,它會爲你提供指針的引用,因此你會得到指向的數據。這在int的情況下不會發生,因爲沒有重載,所以您必須自己對指針取消引用。

1

鑑於Foo*類型的變量foo,表達式foo+nFoo*型的(假設n是一個組成型)。

打印指針的默認std::ostream機制是打印指針。有一個特別針對const char*指針的覆蓋,它是打印由該指針指向的(可能是)以空字符結尾的字符串。

底線:不是char*的指針將被打印爲指針。指針char*將作爲字符串打印。