风车呼呼呼 发表于 2022-4-10 19:37:03

void指针强制类型转换

#include <stdio.h>
int main(void){
      int num = 1024;
      int *pi = &num;
      char *ps = "FishC";
      void *pv;

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

      pv = ps;
      printf("ps: %p, pv: %p\n", ps, pv);
      printf("*pv: %s\n", (int *)pv);
      return 0;
}


最后一条输出为什么转换为int类型指针也能正确输出?

人造人 发表于 2022-4-10 19:56:45

printf只认格式化字符串,不管你指针的类型
指针就是一个数字,数字对就行,类型不管

zzxhh628 发表于 2022-4-10 20:02:13

printf第二个参数是可选变参的,你传入什么类型数据应该都行,它不管你输入什么数据最后把它根据格式说明符格式化成你要输出类型的字符串,并打印到屏幕它的工作就完成了。

风车呼呼呼 发表于 2022-4-10 20:35:43

人造人 发表于 2022-4-10 19:56
printf只认格式化字符串,不管你指针的类型
指针就是一个数字,数字对就行,类型不管

void指针不行的,不交代数据类型编译器不会知道该读多少字节的数据,这是直接报错的

风车呼呼呼 发表于 2022-4-10 20:36:51

zzxhh628 发表于 2022-4-10 20:02
printf第二个参数是可选变参的,你传入什么类型数据应该都行,它不管你输入什么数据最后把它根据格式说明符 ...

void指针不转换是要报错的

zzxhh628 发表于 2022-4-10 20:38:07

void *应该是可以指向任何类型的指针,所以可以强制转换。

zzxhh628 发表于 2022-4-10 20:38:38

很多的函数的参数不确定就用void *来定义参数。

人造人 发表于 2022-4-10 20:40:26

风车呼呼呼 发表于 2022-4-10 20:35
void指针不行的,不交代数据类型编译器不会知道该读多少字节的数据,这是直接报错的

什么?
$ cat main.c
#include <stdio.h>

int main(void) {
    const char *str = "hello world!";
    void *data = str;
    printf("%s\n", data);
    return 0;
}
$ gcc-debug -o main main.c
main.c: In function 'main':
main.c:5:18: warning: initialization discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
    5 |   void *data = str;
      |                  ^~~
main.c:6:14: warning: format '%s' expects argument of type 'char *', but argument 2 has type 'void *' [-Wformat=]
    6 |   printf("%s\n", data);
      |             ~^   ~~~~
      |            |   |
      |            |   void *
      |            char *
      |             %p
$ ./main
hello world!
$

cjgank 发表于 2022-4-10 22:12:52

这个问题问得好,楼主解决了,告知下,谢谢!
页: [1]
查看完整版本: void指针强制类型转换