void指针强制转化为啥有区别


int num = 1024;
int *pi = #
char *ps = "FIshC";
void*pv;
pv = pi;
printf("*pv:%p\n",*(int *)pv);
pv = ps;
printf("*pv:%p\n",(int *)pv);

为什么两次强制转化不一样

在C/C++编程语言中,void指针是一种特殊类型的指针,可以指向任何数据类型。然而,由于void指针不具有特定的数据类型,因此无法直接对其进行解引用或执行算术操作。为了使用void指针指向的数据,必须将其强制转换为其他具有具体数据类型的指针。
在强制转换void指针时,需要知道指针所指向的数据类型,然后将其转换为相应类型的指针。例如,如果void指针指向一个int类型的数据,可以使用以下方式将其转换为int指针:

void* ptr; // void指针  
int* int_ptr = (int*)ptr; // 强制转换为int指针

同样地,如果void指针指向一个char类型的数据,可以使用以下方式将其转换为char指针:

void* ptr; // void指针  
char* char_ptr = (char*)ptr; // 强制转换为char指针

需要注意的是,如果强制转换的指针类型与实际指向的数据类型不匹配,可能会导致未定义的行为或程序崩溃。因此,在进行强制转换之前,必须确保知道指针所指向的数据类型,并且将其转换为正确的类型。

第七行多星号, 改为

printf("*pv:%p\n",(int *)pv);

【以下回答由 GPT 生成】

问题分析: 这段代码中,使用了一个void指针pv来存储int类型和char类型的指针。通过强制类型转换将pv指针转化为int类型指针和char类型指针,并分别打印出对应的结果。

问题解答: 第一次强制转换得到的结果是正确的,因为pv指针存储的是int类型指针的地址,通过强制类型转换后,再使用解引用操作符*来获取指针指向的值,即num的值。

第二次强制转换得到的结果是不正确的,因为pv指针存储的是char类型指针的地址,通过强制类型转换后,再使用解引用操作符*来获取指针指向的值,这里由于类型不匹配,会导致解引用操作符错误地解释指针指向的内存,即输出的结果是不确定的。

正确的做法是,当我们将pv指针转换为char类型指针后,直接打印指针本身即可,不应使用解引用操作符来获取指针指向的值。

代码修改如下:

int num = 1024;
int *pi = #
char *ps = "FIshC";
void *pv;

pv = pi;
printf("*pv: %p\n", *(int *)pv);

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

答案用Markdown格式返回:

第一次强制转换得到的结果是正确的,因为pv指针存储的是int类型指针的地址,通过强制类型转换后,再使用解引用操作符*来获取指针指向的值,即num的值。

第二次强制转换得到的结果是不正确的,因为pv指针存储的是char类型指针的地址,通过强制类型转换后,再使用解引用操作符*来获取指针指向的值,这里由于类型不匹配,会导致解引用操作符错误地解释指针指向的内存,即输出的结果是不确定的。

正确的做法是,当我们将pv指针转换为char类型指针后,直接打印指针本身即可,不应使用解引用操作符来获取指针指向的值。

代码修改如下:

```c
int num = 1024;
int *pi = #
char *ps = "FIshC";
void *pv;

pv = pi;
printf("*pv: %p\n", *(int *)pv);

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

```



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^