所以我想指向一个字符的指针,然后输出地址,输出这个奇怪的东西:t + a。有什么帮助吗?
#include <iostream>
using namespace std;
int main() {
char a = 't';
char* p = &a;
cout << p;
return 0;
}
答案 0 :(得分:5)
您正在打印cout
类型,cout << (void *)p;
-- OR --
cout << static_cast<void *>(p);
尝试将其解释为字符串。
使用:
打印指针的值(它指向的地址)<af:commandButton text="NONE"
id="downloadInstructionsBtn"
action=" "
visible="false"
clientComponent="true"
partialSubmit="false">
<af:fileDownloadActionListener filename="Инструкции пользователя"
contentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
method="#{pageFlowScope.vocsReportsRegionController.instructionsDownload}"/>
</af:commandButton>
答案 1 :(得分:3)
问题是char *
通常不仅用作指向char
的指针,而是指向null-terminated C-string的指针。 cout
will then print all the characters pointed to by p
until it finds a '\0'
,这样你就可以看到t
,然后打印出无效的内存,这是一种未定义的行为,可能会崩溃或打印垃圾或其他内容。
解决此问题的方法是使用void *
或const void *
代替,这只是一个带有地址但没有附加类型信息的指针。 void *p = &a;
将是一个修复。 void *p2 = p;
然后使用std::cout << p2;
将是另一个。您还可以使用其他答案中显示的强制转换,但您应该使用像static_cast<const void*>(p)
这样的C ++强制转换,而不是像(void *)p
这样的C强制转换,因为一旦习惯了它们,它们就会变得更容易阅读和理由。
答案 2 :(得分:0)
如果您想要指针的地址,请将其转换为void指针
std::cout << (void *)p;
或使用带有%p选项的printf
printf("%p", p);
否则它将被视为空终止字符串,它不是。