2014-07-19 109 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