【问题标题】:Printing pointer values打印指针值
【发布时间】:2012-08-23 21:08:48
【问题描述】:

我编写了以下程序来理解将整数值添加到指针值。在我的例子中,指针指向整数。我知道如果 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;
}

【问题讨论】:

标签: c++ pointers


【解决方案1】:

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

std::cout << (void *)(u+i) << std::endl;

【讨论】:

  • 您的建议按我的方式工作,但原因是什么?
  • @curvature 也许你在我编辑之前加载了帖子?在 C++ 中,字符数组是特殊的;指向char 的指针也是如此。
  • 其实没有,我没有。我只是想了解为什么将 char* 转换为 void* 有效。我真的不明白什么是 void*。
  • @curvature 啊。 void * 是一个可以保存任何对象类型的指针。在这种情况下,它作为cout 的指示,告诉它将u + i 视为指针,而不是字符串。将其从char * 中移除会使cout 选择一个恰好打印地址的不同重载。
  • @curvature,FFR,应该是 const char *(或 std::string,因为这是 C++)。内容是只读的,你应该在变量的类型中反映出来。
【解决方案2】:

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

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

编辑来自 cmets:

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

【讨论】:

  • 你认为投射到int 是安全的吗?
  • void * 演员表会更合适。
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 2019-08-06
    • 1970-01-01
    • 2011-01-29
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 2013-12-02
    相关资源
    最近更新 更多