整型与指针的相互转换(int<->int*,long<->long*)

最近看代码,碰到这么一个数据结构ULONG_PTR,看到PTR以为是指针类型(PoinTeR),但追到windows定义发现居然是整型:unsigned long,而不是指针!

<BaseTsd.h> 定义中定义如下:typedef _W64 unsigned long ULONG_PTR, *PULONG_PTR;

_W64被32位编译器忽略,被64位编译器解读为long占64位,long*占64位,不然long和long*依旧解读为int和int*,占32位。

_PTR后缀称为指针精度数据类型,确实是PoinTeR的意思,但不代表数据类型是指针。

ULONG_PTR就是unsigned long,PULONG_PTR才是之前认为的指针类型。指针数据精度具有多态的特性,如上文所述,根据编译器是否是64位的选择是否将相关指针、整型解读为64位的。

_PTR数据的出现是为了使同一个代码既可以编译为32位系统的版本也可以编译为64位系统的版本。



由于int和int*都是4个字节,区别就在于编译器对他们的解释和操作不同,

1)对于用int标记的区域,编译器直接取相应变量对应地址的值,并返回该值;对于int*标记的内存,允许*操作,去该内存空间中的值,并以该值进行寻址,取相应地址的值返回。

2)int*标记区域的内存值只允许加减运算,而int标记区域的值允许各种算术运算。因此int与int*之间是可以相互转化的,只是转化完编译器会做出不同的解释,程序员应保证解释的内容符合逻辑和目的。


long与long*同理也可以相互转换,ULONG_PTR和PULONG_PTR也可以相互转换。


参考代码:

-------------------------代码开始---------------------------------------------------

void main(){

int i = 5;
int *p = &i;
int j = (int)p;//十六进制转二进制


printf("int i = 5;\n");
printf("Value of i is %d, address of i is 0x%x\n",i,&i);
printf("int *p = &i;\n");
printf("Adress of Pointer P is: 0x%x, Value of P is: 0x%x=%d, Value of P pointed is: %d\n",&p,p,p,*p);
if(p==&i)
printf("Value of p is the address of i\n");
printf("Value of j is %d\n",j);
printf("Value of j is 0x%x\n",j);
printf("Value of j pointed is: %d\n",*(int*)j);

}

----------------------------代码结束--------------------------------------------

运行结果:


尤其printf("Adress of Pointer P is: 0x%x, Value of P is: 0x%x=%d, Value of P pointed is: %d\n",&p,p,p,*p);一句可见:

将指针转换为整型其结果是将十六进制的地址转换为十进制的地址!

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据你提供的代码,这段代码的功能是在链表中删除满足条件的节点,并将被删除节点的num保存在一个静态数组arr中,最后通过参数N传递删除的节点数量。 首先,我注意到你在代码中使用了一个静态数组arr来保存被删除节点的num。请注意,静态数组在函数调用结束后仍然存在,但是它的地址是固定的,如果你将它的地址返回给调用者,那么调用者在使用这个地址时可能会遇到问题。建议你使用动态分配的内存来保存被删除节点的num,这样可以避免潜在的问题。 另外,需要注意的是,在循环中判断链表节点的条件中,你使用了字符串比较函数strcmp来比较Major字符串,这是正确的。但是对于整型变量Class的比较,你使用了==运算符,这是正确的。对于数组score中第Course - 1个元素的比较,你使用了<运算符和Score进行比较,也是正确的。 最后,你需要在删除节点之前维护链表的连接关系,即修改前一个节点的next指针,使其指向被删除节点的下一个节点。 下面是修改后的代码: ```cpp long long* Delete_score(STU* p_head, char Major[], int Class, int Course, int Score, int* N) { long long* arr = malloc(10 * sizeof(long long)); // 使用动态分配的内存 STU* p_mov = p_head->next; int n = 0; STU* prev = p_head; // 保存前一个节点的指针 while (p_mov != NULL) { if ((strcmp(p_mov->major, Major) == 0) && (p_mov->class == Class) && (p_mov->score[Course - 1] < Score)) { arr[n] = p_mov->num; n++; prev->next = p_mov->next; // 修改前一个节点的next指针 free(p_mov); // 释放被删除节点的内存 p_mov = prev->next; // 更新当前节点指针 } else { prev = p_mov; // 更新前一个节点指针 p_mov = p_mov->next; // 更新当前节点指针 } } *N = n; return arr; } ``` 请注意,在使用完动态分配的内存后,记得在不再使用时释放内存,避免内存泄漏。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值