为什么以下代码失败

jus*_*ody 2 c

#include <stdio.h>

int *top;
int a=1;
top=&a;

void main()
{
    printf("%d\n",*top);
}
Run Code Online (Sandbox Code Playgroud)
error C2440: 'initializing' : cannot convert from 'int *' to 'int'

UPDATE

我知道如何使它工作,但我问为什么它不起作用.

Chr*_*odd 6

你实际上是在嘲笑编译器对古老C语法的支持.原始C编译器允许没有类型的声明,将其默认为int.所以在任何功能之外,

foo;
Run Code Online (Sandbox Code Playgroud)

会声明一个int名为的全局变量foo.所以当你说

top = &a;
Run Code Online (Sandbox Code Playgroud)

它声明了一个调用的全局int变量,top并尝试使用地址初始化它a.这会给你看到两个错误 - 两个冲突的声明top和无法转换int *int.当然,那些相同的古老C编译器不会给你第二个错误,愉快地将地址转换为int而没有抱怨.

这也告诉你为什么int i; i = 100;工作---它i作为一个全局int变量的两个声明(这是好的,因为它们是相同的类型),第二个初始化它100(这是好的,因为只有一个声明有一个初始化器)

Dennis Ritchie的"C语言的发展"中有很多有趣的东西