关于指针初始化赋初值的小疑点

关于指针初始化赋初值的小问题
int n=1;
int* p;
p=&n;
系统·会报错:'p' : missing storage-class or type specifiers
                          'p' : 'int' differs in levels of indirection from 'int *'
                           cannot convert from 'int *' to 'int'

但采用初始化就没问题:
int n=1;
int *p=&n;
这是为什么
------解决方案--------------------
p=&n;单独写就是赋值语句了
不能写在函数之外
------解决方案--------------------
引用:
p=&n;单独写就是赋值语句了
不能写在函数之外
++

------解决方案--------------------
“变量赋值”和“变量初始化”不是一回事!
“变量赋值”发生在运行期,其写法遵循赋值语法规定。
“变量初始化”发生在编译期或运行期,其写法遵循初始化列表语法规定。

------解决方案--------------------
引用:
p=&n;单独写就是赋值语句了
不能写在函数之外

多半是这个问题。 
------解决方案--------------------
函数之外只能有声明,不能有其他语句。

int * p = &n;就只是声明,这里的=表示初始化;
p = &n;就是个赋值语句了,这里的=表示赋值。