char *和整数,你能转换吗?

时间:2015-03-28 01:35:06

标签: c pointers

为什么我不能这样做:

char * p = (char *) 48;
printf("%d", p[0]); // why doesn't this give me 4

但我可以这样做:

char p = 48;
printf("%d", p);

感谢

3 个答案:

答案 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

当它们具有相同的大小时,您可以在指针和整数之间进行转换。