void指针强制类型转换
#include <stdio.h>int main(void){
int num = 1024;
int *pi = #
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类型指针也能正确输出? printf只认格式化字符串,不管你指针的类型
指针就是一个数字,数字对就行,类型不管
printf第二个参数是可选变参的,你传入什么类型数据应该都行,它不管你输入什么数据最后把它根据格式说明符格式化成你要输出类型的字符串,并打印到屏幕它的工作就完成了。 人造人 发表于 2022-4-10 19:56
printf只认格式化字符串,不管你指针的类型
指针就是一个数字,数字对就行,类型不管
void指针不行的,不交代数据类型编译器不会知道该读多少字节的数据,这是直接报错的 zzxhh628 发表于 2022-4-10 20:02
printf第二个参数是可选变参的,你传入什么类型数据应该都行,它不管你输入什么数据最后把它根据格式说明符 ...
void指针不转换是要报错的 void *应该是可以指向任何类型的指针,所以可以强制转换。 很多的函数的参数不确定就用void *来定义参数。 风车呼呼呼 发表于 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!
$
这个问题问得好,楼主解决了,告知下,谢谢!
页:
[1]