C的两个指针问题

1.int *p1 = *(int **)p2;
  这个表达式将p2指向的值当做指针类型赋值给p1

,将普通值当做指针值使用
2.*(int **)p1 = p2;
  这个表达式将p1指向的值修改为的p2保存的指针

的值,将指针当做普通值使用

 

这是今天看us/OS的内存管理的时候看到的,真是太精辟了

唉,看来自己的见识还是太少了,以后得加倍努力

### 判断两个指针类型是否相同的方法 在C语言中,判断两个指针类型是否相同主要依赖于它们所指向的数据类型是否一致。C语言要求指向相同类型的指针才能进行某些操作,例如指针的赋值、比较和算术运算等[^1]。指针类型是否相同可以通过以下几种方式判断: #### 1. **类型匹配** 两个指针变量的类型必须完全一致。例如,`int *p1` 和 `int *p2` 是相同类型的指针,而 `int *p` 和 `float *p` 是不同类型的指针指针类型匹配的规则基于C语言对类型系统的定义,即指针必须指向相同的数据类型。 #### 2. **使用 `typeof` 或 `__typeof__` 扩展(GCC 编译器)** 在GCC编译器中,可以使用 `__typeof__` 来获取指针的类型,并进行比较。例如: ```c #include <stdio.h> int main() { int *p1; int *p2; float *p3; if (__typeof__(p1) == __typeof__(p2)) { printf("p1 and p2 have the same type.\n"); } else { printf("p1 and p2 have different types.\n"); } if (__typeof__(p1) == __typeof__(p3)) { printf("p1 and p3 have the same type.\n"); } else { printf("p1 and p3 have different types.\n"); } return 0; } ``` 此方法依赖于GCC扩展,不能在标准C环境中直接使用。 #### 3. **通过编译时类型检查** C语言的编译器会在编译阶段进行类型检查,如果两个指针类型不一致,编译器会报错。例如,在赋值操作中,若尝试将 `float *` 类型的指针赋值给 `int *` 类型的指针,编译器会提示类型不匹配错误。这种机制确保了指针类型的一致性。 #### 4. **运行时类型信息(RTTI)模拟** C语言本身不支持运行时类型信息(RTTI),但可以通过定义结构体或联合体来模拟指针类型的检查。例如,定义一个包含类型标识的结构体,并在运行时检查标识字段: ```c #include <stdio.h> typedef enum { TYPE_INT, TYPE_FLOAT, TYPE_CHAR } PointerType; typedef struct { void *ptr; PointerType type; } TypedPointer; int are_pointers_same_type(TypedPointer p1, TypedPointer p2) { return p1.type == p2.type; } int main() { int a = 10; float b = 20.0f; TypedPointer tp1 = {&a, TYPE_INT}; TypedPointer tp2 = {&b, TYPE_FLOAT}; if (are_pointers_same_type(tp1, tp2)) { printf("Pointers have the same type.\n"); } else { printf("Pointers have different types.\n"); } return 0; } ``` 此方法通过封装指针类型信息来实现运行时的类型比较,适用于需要动态判断指针类型的场景。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值