2014-07-19 144 views
1

我的問題是關於我正在研究的指針算術。混亂的字符數組和指針

在學習過程中,當我將整數數組的地址指定給void指針並打印指針時,發現我遇到了一個奇怪的行爲,地址被打印出來。

但是,當我試圖給一個字符數組的地址到void指針和打印指針,它打印數組的條目而不是顯示他們的地址。

#include <iostream.h> 
#include <conio.h> 

void main() 
{ 
    char a[5] = {'h', 'e', 'l', 'l', 'o'}; 
    void *ptr; 
    ptr = &a[0]; 
    for(int i = 0; i < 5; i++) 
    { 
     cout << ptr << endl; 
     ptr++; 
    } 
    getch(); 
} 

輸出:

hello 
ello 
llo 
lo 
o 

我期待的是,對應的數組元素的地址將被打印。

+1

'main'總是返回類型'int'!哪個編譯器? – Deduplicator

+1

@Deduplicator,99%肯定它是臭名昭着的Turbo C++。 – chris

+4

你看到的行爲不是標準的,但是再一次,'iostream.h'甚至不是一個標準的C++頭,而'conio.h'是完全不必要的。 – chris

回答

2

看起來像iostream Turbo C++類的類別將void*視爲char*

要獲得印刷採用Turbo C++的地址,請嘗試這一行的,而不是你現在擁有的一切:

cout << (unsigned)ptr << endl; 

注:我沒有實際測試,因爲ISO C++禁止遞增類型的指針'void'*並且我沒有Turbo C++ ...並且請記住,使用Turbo C++,您並不真正學習C++,您只是學習使用類似於現代C++的語言進行編程,但會執行一些操作事情有所不同,並且缺少當前標準中的東西lot


僅供參考,下面是對GCC工作的代碼:

#include <iostream>  
using namespace std; 

int main() 
{ 
    char a[5] = {'h','e','l','l','o'}; 

    for(int i=0; i < sizeof(a); i++) 
    { 
     cout << (void*)&a[i] << endl; 
    } 
} 
0

它看起來像的Turbo C++「知道」 ptr是「真的」一char*儘管你宣佈它void*。這就是ptr++在某種程度上能夠將ptr中存儲的指針從&a[0]更改爲&a[1]。如果它確實將ptr編譯爲合適的void*,則不可能在指針上執行該算術。

你看到的行爲正是你應該看到,如果你已經宣佈char* ptr