我的编译器返回;分配给';int*';来自不兼容的指针类型';字符*';[-Wincompatible指针类型]";当我运行我的C程序时

我的编译器返回;分配给';int*';来自不兼容的指针类型';字符*';[-Wincompatible指针类型]";当我运行我的C程序时,c,compiler-errors,clang,compiler-warnings,gcc-warning,C,Compiler Errors,Clang,Compiler Warnings,Gcc Warning,警告会准确地告诉你它是什么。它说: 使用“char*”类型的表达式初始化“int*”的指针类型不兼容 这意味着p类型为int*,&grade类型为char*,这两个指针不兼容。解决方案是将p的声明更改为: warning: incompatible pointer types initializing 'int *' with an expression of type 'char *' [-Wincompatible-pointer-types] int *p = &

警告会准确地告诉你它是什么。它说:

使用“char*”类型的表达式初始化“int*”的指针类型不兼容

这意味着
p
类型为
int*
&grade
类型为
char*
,这两个指针不兼容。解决方案是将
p
的声明更改为:

warning: incompatible pointer types initializing 'int *' with an
      expression of type 'char *' [-Wincompatible-pointer-types]
    int *p = &grade;
         ^   ~~~~~~
1 warning generated.
 ./main
The address where the grade is stored: 0x7ffc3bb0ee2b
Grade: A"
还有一件事。通常,您可以安全地在指向
void*
的任何指针之间进行隐式转换,但在作为参数传递给变量函数时则不能。如果要打印地址,请使用以下命令:

char *p = &grade;
但只有在需要的时候才投。永远不要只是为了摆脱警告而这样做。以下是我写的一个答案:

或者,您可以直接使用void指针:

printf("%p", (void *)p);
但是如果你想取消引用它,你就需要进行强制转换。例如:

void *p = &grade;
printf("%p", p);

如果
p
被声明为
char*

则不需要该强制转换,因为它告诉您您正在尝试使整数指针
p
指向字符
等级
;这些不兼容。关于如何更正的建议?标题中的消息来自不同的代码。请使用
char*
而不是
int*
来存储
&grade
,因为
grade
类型为
char
,然后使用指向
grade
的指针(这就是
&grade
的含义)必须是
char*
类型。这就是错误消息告诉您的(“不兼容的指针类型初始化'int*'时使用'char*'类型的表达式”(emphasis mine))。
void *p = &grade;
printf("%p", p);
char c = *(char*)p;