鱼C论坛

 找回密码
 立即注册
查看: 851|回复: 2

[已解决]关于void指针的问题

[复制链接]
发表于 2023-10-28 18:40:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 BaysideLizard 于 2023-10-28 18:42 编辑
#include <stdio.h>

int main()
{
    int num = 1024;
    int *pi = #
    char *ps = "abcd";
    void *pv;

    pv = pi;
    printf("pi addr:%p\n",pi);
    printf("pv addr:%p\n",pv);
    printf("pv:%d\n",*(int *)pv);
    putchar('\n');
    
    ps = (char *)pv;

    pv = (char *)ps;
    printf("ps addr:%p\n",ps);
    printf("pv addr:%p\n",pv);
    printf("pv:%s\n",(char *)pv);

    return 0;
}

执行结果:
pi addr:000000000061FE04
pv addr:000000000061FE04
pv:1024

ps addr:000000000061FE04
pv addr:000000000061FE04
pv:

Process returned 0 (0x0)   execution time : 0.036 s
Press any key to continue.


小甲鱼的《带你学C带你飞》S1E25课
为什么在视频里说加了ps = (char *)pv;这一句执行结果就不尽如人意了?
最佳答案
2023-10-28 18:41:17
在这段代码中, void *pv  是一个指向  void  类型的指针。 void  指针可以指向任何类型的数据,但是在使用时需要进行类型转换。

在第一部分代码中, pv = pi;  将  int  类型的指针  pi  赋值给了  void  指针  pv 。这是一个合法的操作,因为  void  指针可以指向任何类型的数据。然后,通过  (int *)pv  将  pv  转换回  int  类型的指针,再通过  *(int *)pv  取出指针所指向的值。因此,打印出的结果是  1024 。

在第二部分代码中, ps = (char *)pv;  将  void  指针  pv  转换为  char  类型的指针,并赋值给  ps 。这个操作是合法的,因为  void  指针可以指向任何类型的数据。然后,通过  (char *)pv  将  pv  再次转换为  char  类型的指针,再通过  (char *)pv  打印出指针所指向的字符串。然而,这里存在一个问题,因为  pv  实际上指向的是一个  int  类型的数据,而不是一个字符串。所以,打印出的结果是空字符串。

所以,加了  ps = (char *)pv;  这一句后,执行结果不如预期。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-10-28 18:41:17 | 显示全部楼层    本楼为最佳答案   
在这段代码中, void *pv  是一个指向  void  类型的指针。 void  指针可以指向任何类型的数据,但是在使用时需要进行类型转换。

在第一部分代码中, pv = pi;  将  int  类型的指针  pi  赋值给了  void  指针  pv 。这是一个合法的操作,因为  void  指针可以指向任何类型的数据。然后,通过  (int *)pv  将  pv  转换回  int  类型的指针,再通过  *(int *)pv  取出指针所指向的值。因此,打印出的结果是  1024 。

在第二部分代码中, ps = (char *)pv;  将  void  指针  pv  转换为  char  类型的指针,并赋值给  ps 。这个操作是合法的,因为  void  指针可以指向任何类型的数据。然后,通过  (char *)pv  将  pv  再次转换为  char  类型的指针,再通过  (char *)pv  打印出指针所指向的字符串。然而,这里存在一个问题,因为  pv  实际上指向的是一个  int  类型的数据,而不是一个字符串。所以,打印出的结果是空字符串。

所以,加了  ps = (char *)pv;  这一句后,执行结果不如预期。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-28 18:41:19 | 显示全部楼层
在C语言中,void指针是一种特殊类型的指针,可以指向任何数据类型。在你的代码中,你首先将整数指针pi赋值给void指针pv,然后再将pv的值赋给字符指针ps。这就是问题的关键所在。

当你执行ps = (char *)pv;这一句时,你实际上是将一个整数的地址赋给了一个字符指针。因为整数和字符的大小和表示方式是不同的,所以当你试图通过字符指针来访问整数时,你会得到一个不可预期的结果。

在你的代码中,你试图打印出通过字符指针ps访问的字符串,但是ps实际上指向的是一个整数的地址,所以打印出的结果是空的,因为它并不能正确地解析出一个字符串。

所以,小甲鱼在视频中说,加了ps = (char *)pv;这一句执行结果就不尽人意,是因为这样做违反了数据类型的规则,导致了不可预期的结果。在实际编程中,我们应该尽量避免这种类型的混淆。
请注意,本回答来自GPT-4
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-5 17:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表