我想看看将整数指针转换ptr为字符指针后会发生什么ptr0。但是,最后两个打印语句不会将任何输出打印到控制台。
#include <iostream>
using namespace std;
int main(void)
{
int var = 1025;
int *ptr = &var;
//~ addr of var
cout << ptr << endl;
//~ value of var - dereferencing
cout << *ptr << endl;
char *ptr0;
//~ typecasting int to char
ptr0 = (char*)ptr; // also tried: ptr0 = (char*)&var
cout << ptr0 << endl;
cout << *ptr0 << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出显示:
0x7ffd6d8f4b94
1025
Run Code Online (Sandbox Code Playgroud)
预期结果:
0x7ffd6d8f4b94
1025
0x7ffd6d8f4b94
1
Run Code Online (Sandbox Code Playgroud)
这两行都打印出一些东西。但是,这种“东西”是无法打印的。
在C ++中char*被认为是字符串。因此,与其他所有指针类型不同,它cout不会告诉您a所char*存储的地址,而是会将其所指向的内存解释为chars 的空终止数组。同样,这是因为char*在C ++中得到了特殊的对待。在您的情况下,您1025(或0x00000401十六进制)存储的内存如下所示:
01 04 00 00
Run Code Online (Sandbox Code Playgroud)
如果您ptr0指出这一点,它将指向01。由于它是a,char*因此将其解释为长度为2的字符串:第一个字符为01,第二个字符为,04然后有一个00确定结尾的字符串。查看ASCII表,我们看到那些字符引用了一些不可打印的字符(我从零到一点都不知道它们(曾经)有什么用)。因此,cout除了以下内容外,不输出任何内容endl。
cout << *ptr0 << endl; 另一方面,将仅打印该字符串的第一个字符,而该字符又不能打印。
如果要打印地址和数字而不是字符串和字符,则必须将它们分别强制转换回其他指针和整数,例如:
cout << (void*)ptr0 << endl;
cout << (int)*ptr0 << endl;
Run Code Online (Sandbox Code Playgroud)
在这里查看它如何打印您的预期结果。