马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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;这一句执行结果就不尽如人意了?
在这段代码中, 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; 这一句后,执行结果不如预期。
|