C++ 打印指针值
我编写了以下程序来理解整数值与指针值的相加。在我的例子中,指针指向整数。我知道,如果p是指向整数的指针,那么p+2是存储在前面两个整数或2*4字节=8字节的整数的地址。下面的程序与我期望的整数数组一样工作,但对于char数组,它只打印空行。谁能给我解释一下原因吗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
#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更合适。