1

我编写了以下程序来了解将整数值添加到指针值。在我的例子中,指针指向整数。我知道如果 p 是一个指向整数的指针,那么 p+2 是存储“前面两个整数”的整数的地址(或 2*4 字节 = 8 字节)。下面的程序按我对整数数组的预期工作,但对于 char 数组,它只打印空行。有人可以向我解释为什么吗?

#include <iostream>

int main() {

    int* v = new int[10];

    std::cout << "addresses of ints:" << std::endl;

    // works as expected
    for (size_t i = 0; i < 10; i++) {
        std::cout << v+i << std::endl;
    }

    char* u = new char[10];

    std::cout << "addresses of chars:" << std::endl;

    // prints a bunch of empty lines
    for (size_t i = 0; i < 10; i++) {
        std::cout << u+i << std::endl;
    }

    return 0;
}
4

3 回答 3

6

这是因为char *具有特殊意义(C 字符串),所以它尝试将其打印为字符串。投射指针以cout告知您想要什么:

std::cout << (void *)(u+i) << std::endl;
于 2012-08-23T21:10:01.530 回答
1

当您打印 a 时,char*您正在打印字符串。所以,你得到垃圾值。您可以将其转换为 int 以打印它。

std::cout << (int)(u+i) << std::endl;

从评论编辑:

正如已经指出的那样,void*演员阵容更好。用于打印int的 AFAIK 很好,但void*它是正确的方法

于 2012-08-23T21:11:42.130 回答
1

当我将指针值转换为 long long 时,它对我有用。

    std::cout << (long long)(u+i) << std::endl;

如果您有大内存(> 2 GB),您应该使用 long long 而不是 int

于 2012-08-23T21:14:23.577 回答