Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 打印指针值_C++_Pointers - Fatal编程技术网

C++ 打印指针值

C++ 打印指针值,c++,pointers,C++,Pointers,我编写了以下程序来理解整数值与指针值的相加。在我的例子中,指针指向整数。我知道,如果p是指向整数的指针,那么p+2是存储在前面两个整数或2*4字节=8字节的整数的地址。下面的程序与我期望的整数数组一样工作,但对于char数组,它只打印空行。谁能给我解释一下原因吗 #include <iostream> int main() { int* v = new int[10]; std::cout << "addresses of ints:" <&l

我编写了以下程序来理解整数值与指针值的相加。在我的例子中,指针指向整数。我知道,如果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;
}
这是因为char*在C字符串中有特殊的意义,所以它试图将其打印为字符串。投射指针,让cout知道您想要什么:

std::cout << (void *)(u+i) << std::endl;
这是因为char*在C字符串中有特殊的意义,所以它试图将其打印为字符串。投射指针,让cout知道您想要什么:

std::cout << (void *)(u+i) << std::endl;
打印字符*时,您正在打印字符串。所以,你得到的是垃圾价值。您可以将其强制转换为int以打印它

std::cout << (int)(u+i) << std::endl;
根据评论编辑:

正如已经指出的,空心*铸件更好。打印int的AFAIK很好,但是void*是正确的方法,当您打印char*时,您正在打印字符串。所以,你得到的是垃圾价值。您可以将其强制转换为int以打印它

std::cout << (int)(u+i) << std::endl;
根据评论编辑:


正如已经指出的,空心*铸件更好。打印int的AFAIK很好,但void*是正确的方法

当我将指针值转换为long-long时,它对我很有效

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

如果内存大于2 GB,则应该使用long-long而不是int。当我将指针值转换为long-long时,它对我很有效

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

如果你有大于2 GB的大内存,那么你应该使用long long而不是int。你建议的内容的可能重复项符合我的要求,但原因是什么?也许你在我编辑之前加载了这篇文章?在C++中,字符数组是特殊的;指向char的指针也是。实际上没有。我只是想弄明白为什么将一个字符*转换成一个空*是有效的。我真的不明白什么是空*啊。void*是可以容纳任何对象类型的指针。在这种情况下,它作为一个指示,告诉它将u+i视为指针,而不是字符串。将它从char中移除使得CUT选择一个不同的重载,打印地址。@曲率,FFR,应该是const char或STD::string,因为这是C++。内容是只读的,您应该在变量的类型中反映这一点。您建议的方式符合我的要求,但原因是什么?@curvature也许您在我编辑之前加载了文章?在C++中,字符数组是特殊的;指向char的指针也是。实际上没有。我只是想弄明白为什么将一个字符*转换成一个空*是有效的。我真的不明白什么是空*啊。void*是可以容纳任何对象类型的指针。在这种情况下,它作为一个指示,告诉它将u+i视为指针,而不是字符串。将它从char中移除使得CUT选择一个不同的重载,打印地址。@曲率,FFR,应该是const char或STD::string,因为这是C++。内容是只读的,您应该在变量的类型中反映出来。您认为强制转换为int是安全的?void*cast更合适。您认为强制转换为int是安全的?void*cast更合适。