c++ 指针的强制类型转换

本文探讨了C++中指针的使用方法,包括内存分配、类型转换及其影响,并通过示例展示了如何通过指针调用虚函数实现多态性。此外,还介绍了指针步长的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果有一个指针 int *p=new int ; 这句话的意思是1、声明一个指向int型变量的指针p,2、new动态申请一块int 大小的内存,并将p指向这块内存。

对p进行强制类型转换时,我们可以通过(TYPE *)p操作进行。

(TYPE*)p强制类型转换的结果是:指针p的类型变为TYPE*,他所指向的内容变为TYPE类型。

--------------------------------------------------------------------------------------------------------------------------------------

分享一道题目:

class A {public: void virtual fun(){cout<<" A "<<endl;}};

class B :public A{public: void virtual fun(){cout << " B "<<endl; }};

int main()

{ A *pa = new A ; pa->fun();

B * pb=(B*) pa; pb->fun();

delete pa,pb;

pa = new B; pa->fun();

pb=(B*) pa; pb->fun();

}

题目答案为:AABB,对于这套题涉及到的知识点如 delete、动态绑定、静态绑定、强制类型转换在之前的博客中有介绍过。

最后提一点指针步长是如何确定的,指针的步长声明指针的时候确定的,例如,int*p;声明p是指向int型的指针,p++指向的是下一个int型大小的内存空间。而char a[20]="hello world!"; int *p=(int*)a; cout<<(p++); p++实际加了4byte。

如图:

### C++指针强制类型转换 #### static_cast 的使用 `static_cast<>()` 运算符可以在相关类型之间进行安全的换,例如从一种指针类型转换为另一种指针类型。这种换被很好地定义了,并且是可移植和可逆的。编译器会对每一个 `static_cast` 执行一些基本的类型检查[^1]。 ```cpp int main() { void* pVoid; int i = 42; double d = 3.14; // 将 int 类型指针换为空指针 pVoid = static_cast<void*>(&i); // 将空指针换回 int 类型指针并解引用读取原始值 int j = *static_cast<int*>(pVoid); // 浮点数到整数的安全换 int k = static_cast<int>(d); return 0; } ``` #### dynamic_cast 的应用 对于涉及继承层次结构中的多态对象之间的换,则应使用 `dynamic_cast<>()`。此操作符会在运行时执行严格的类型验证;当尝试将基类指针或引用来成派生类版本而失败时,它会返回 null 或者引发异常。为了使此类换生效,在基类里应当声明至少一个虚函数[^3]。 ```cpp class Base { virtual ~Base() {} }; class Derived : public Base {}; void example(Base& b) { try { // 安全地把 base reference 换成 derived type Derived &derivedRef = dynamic_cast<Derived&>(b); // 如果成功则继续... } catch (const std::bad_cast&) { // 处理错误情况 } } ``` #### const_cast 和 reinterpret_cast 的介绍 除了上述两种方式外还有两个重要的换工具——`const_cast` 可以移除变量上的常量属性,而 `reinterpret_cast` 则提供了最低级别的重新解释位模式的能力,通常只应在非常特殊的情况下才考虑使用它们[^2]。 ```cpp // 使用 const_cast 移除 const 属性 const char c = 'A'; char mutableChar = const_cast<char&>(c); // 使用 reinterpret_cast 对不同类型间做低级重映射 uintptr_t rawAddress = reinterpret_cast<uintptr_t>(&mutableChar); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值