C `INTA=2;int b=a;`报告意外错误

C `INTA=2;int b=a;`报告意外错误,c,C,假设这样一段最小代码: #include <stdio.h> int main(void) { int a = 2; int b = a; printf("a = %d, &a = %d", a, &a); printf("b = %d, &b = %d", b, &b); return 0; } 我假设a=2b=2相当于a=b=2,但是编译器提示信息很难理解。您试图使用%d格式说明符打印指针,该格式说明符用

假设这样一段最小代码:

#include <stdio.h>
int main(void)
{
    int a = 2;
    int b = a;
    printf("a = %d, &a = %d", a, &a);
    printf("b = %d, &b = %d", b, &b);

    return 0;
}

我假设
a=2
b=2
相当于
a=b=2
,但是编译器提示信息很难理解。

您试图使用
%d
格式说明符打印指针,该格式说明符用于打印
int
。这就是你得到警告的原因

要打印指针,请使用
%p
格式说明符:

printf("a = %d, &a = %p", a, (void*)&a);
printf("b = %d, &b = %p", b, (void*)&b);

另外,请确保将指针强制转换为
void*
。这是因为并非所有指针类型都必须具有相同的表示形式,并且变量函数不能正确地进行转换,因为它不知道实际的类型是什么。因此需要显式转换为
void*

要打印指针,请使用
%p
而不是
%d
&a
不是
int
,而是指向
int
的指针。您的标题具有误导性。正如您从编译输出中看到的,这些是警告并由另一行生成。
&a
是指向int的指针,因此在打印时使用
%p
并将其类型转换为
void*
,因为编译器在有错误的行下加下划线,并用简单的英语解释其原因。我必须说,随着编译器消息的进行,这一条特别有用,也很容易阅读。你能详细解释一下为什么建议将其转换为
void*
吗?@riderdragon
&a
a
的地址,上次你看到它的值是2it@riderdragon您认为地址操作符
返回了什么运算符的地址产生其操作数的非左值地址,适用于初始化指向操作数类型的指针。@riderdragon
a
是一个局部变量
&a
是应用于
a
的地址运算符,提供
a
的地址(指向
a
类型的类型指针)。例如,
inta
&a
将提供类型为
int*
的值(地址为
a
)。您可以将此值(指针)存储在另一个变量中:
inta;int*pA=&a
现在,您可以依次获得
pA
的地址。但是:您无法获取
&a
的地址。返回的值是非左值的,即没有可能寻址的必要存储。请区分“某物的地址”和“有地址的某物”
&a
是前者,而不是后者。我非常感谢您的患者指导@舍夫
printf("a = %d, &a = %p", a, (void*)&a);
printf("b = %d, &b = %p", b, (void*)&b);