integer可以被类型转换为指向integer的指针
Can integer be typecast to pointer to integer?
将int
强制转换为int*
有效吗?如果是,这意味着什么?如果没有,问题出在哪里?
int a=10;
printf("%d", (int *)a);
只是a
而不是&a
。它在devc++中打印10。(int *)a
不是指指向地址10的指针,而不是指向存储值10的某个地址的指针吗?
啊!我还是很困惑。我还有一种情况想不通。
int b=516
printf("\n%d",((char*)b));
它打印516。它不应该印4吗?请解释。
根据C标准(6.3.2.3指针)
5整数可以转换为任何指针类型。除了先前指定,结果是实现定义的,可能不是正确对齐,可能未指向引用的实体类型,并且可能是陷阱表示。67)
在您的代码片段中
int a=10;
printf("%d", (int *)a);
指针(int *)a
可能没有正确对齐,例如当sizeof(int*)等于4或8时。还要考虑到printf 的调用
printf("%d", (int *)a);
具有未定义的行为,
根据C标准(7.21.6.1 fprintf函数-同样适用于printf)
9如果转换规范无效,则行为为未定义.275)如果任何参数不是相应的转换规范,行为是未定义的。
关于这个代码片段
int b=516;
printf("n %d",((char *)b));
则编译器在函数printf内部推送堆栈值516作为地址,并且由于格式说明符CCD_。
是的,您可以将整数强制转换为指针,但语义取决于上下文。整数的位模式将被解释为地址,该地址可能有效也可能无效。
您的示例没有什么意义,虽然(int*)a
是一个等于0xA的地址,但%d
格式说明符会导致printf()
在任何情况下将该值解释为整数——这就是为什么它打印10,但作为地址,它仍然具有值10——即使该地址无效。
考虑:
int a = 10 ;
intptr_t p = (int)&a ; // cast a valid pointer to integer
// large enough to hold an address
int ap = (int*)a ; // a reinterpreted as a pointer
printf( "%dn", a ) ; // Print a
printf( "%pn", &a ) ; // Print address of a
printf( "%d (0x%X)n", p, p ) ; // Print p - an integer equal to &a
printf( "%pn", ap ) ; // Print ap - a interpreted as a pointer
int
到int*
的强制转换未定义。这意味着任何事情都可能发生。可能发生的是,它将指向索引为10的内存块,无论这意味着什么。一些编译器可以实现为int
和int*
具有不同的大小,这将导致不同的问题。
知道吗,如果你运气好,(int *)a
指向地址10,你想看看那里有什么,你可以用取消引用它
printf("%d", *(int *)a);
警告:这可能/可能/可能导致类似于忘记malloc
内存的分段故障。
TL;DR:不要这么做。
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 如何在满足常量表达式的同时将整数传递给指针,传递给 std::array<double、integer>?
- integer可以被类型转换为指向integer的指针