为什么我不能这样做:
char * p = (char *) 48;
printf("%d", p[0]); // why doesn't this give me 4
但我可以这样做:
char p = 48;
printf("%d", p);
感谢
答案 0 :(得分:3)
您无法以可靠的方式在整数和指针之间进行转换。
根据标准:
整数可以转换为任何指针类型。除非事先指明,否则 结果是实现定义的,可能没有正确对齐,可能不指向 引用类型的实体,可能是陷阱表示。
任何指针类型都可以转换为整数类型。除非事先指明,否则 结果是实现定义的。如果结果无法以整数类型表示, 行为未定义。结果不必在任何整数的值范围内 类型。
P.S。这回答了标题中的问题:“ char *和整数,你能转换吗?”。关于“为什么不给我4 ”这个问题,请参阅 @DorianAmouroux 的answer。
答案 1 :(得分:2)
因为(char *)48
表示将整数转换为指针值。
要将数字存储在字符串变量中,您必须执行以下操作:
char p[] = "48";
或使用malloc
:
char *p = strdup("48");
答案 2 :(得分:0)
您需要跟踪变量的大小。在64位系统上,指针的大小(以字节为单位)为8个字节。例如,
int a = 5;
int* b = &a;
std::cout << sizeof(a) << std::endl; // prints 4
std::cout << sizeof(b) << std::endl; // prints 8
这意味着int类型在我的系统上由4个字节表示,即32位。因此,可以存储在整数中的最大值是
2^31 - 1 = 2147483647
8个字节表示64位。因此,我们做不到
// error: cast from 'int*' to 'int' loses precision
int c = (int)b;
但是,我们可以做到
unsigned long long d = (unsigned long long)b;
,因为
std::cout << sizeof(unsigned long long) << std::endl;
打印8.因此,不会丢失精度。
std::cout << d << std::endl; // prints 2358852
std::cout << b << std::endl; // prints 0x23fe44 which is 2358852 in hexadecimal representation.
指向整数表示的指针始终在本机Win32 API中完成。窗口过程(窗口回调函数)的标题是
LRESULT __stdcall wndProc(HWND, UINT, WPARAM, LPARAM);
WPARAM是无符号整数的typedef,其大小(以字节为单位)8。 因此,您会看到所有时间代码,如
char buffer[256];
SendMesssage(hwnd, WM_GETTEXT, 256, (LPARAM) buffer);
注意在最后一个参数中从指针到LPARAM的转换。 见https://msdn.microsoft.com/en-us/library/windows/desktop/ms632627%28v=vs.85%29.aspx
当它们具有相同的大小时,您可以在指针和整数之间进行转换。