Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么全局指针可以';t重新指向另一个对象,但本地指针可以?_C_Pointers - Fatal编程技术网

C 为什么全局指针可以';t重新指向另一个对象,但本地指针可以?

C 为什么全局指针可以';t重新指向另一个对象,但本地指针可以?,c,pointers,C,Pointers,我是C新手,尤其是C指针新手。这里的问题很简单: #include <stdio.h> char *p1 = "Hello"; char *p2; p2 = "world"; // error: redefinition of 'p2' with a different type: 'int' vs 'char *' int main() { char *p3 = "Hello"; char *p4;

我是C新手,尤其是C指针新手。这里的问题很简单:

#include <stdio.h>

char *p1 = "Hello";
char *p2;
p2 = "world";  // error: redefinition of 'p2' with a different type: 'int' vs 'char *'

int main()
{
   char *p3 = "Hello";
   char *p4;
   p4 = "world";  // OK!  p4 can re-point to somewhere
   
   return  0;
}
#包括
char*p1=“你好”;
char*p2;
p2=“世界”//错误:使用不同类型重新定义“p2”:“int”vs“char*”
int main()
{
char*p3=“你好”;
char*p4;
p4=“世界”//好的!p4可以重新指向某个地方
返回0;
}
我声明了一个全局指针
p2
,但我试图给它分配一个字符串
“hello”

但是QT提示一个错误:用不同的类型重新定义'p2','int'vs'char*'

它说,
p2
是一个
int
?但我清楚地声明它是一个
char*

然而,
p4
,作为一个本地指针,可以做同样的事情!在
main
功能中,所有功能均可正常工作


发生什么事了?我搞糊涂了

问题是您不能在全局范围内运行代码。只允许使用静态初始值设定项,它们必须是编译时常量

作品:

char *p2;
int main()
{
    p2 = "world";
}

在这种情况下,错误消息可能不是最有用的。全局范围中唯一可以存在的是声明或定义(带有可选的初始值设定项),因此编译器认为
p2=“world”
是将
p2
声明为新变量,并将其指定为隐式类型
int
,然后发现与上面的
p2
声明冲突并投诉。

指令与本例中的赋值一样,只能存在于函数中。在函数之外,只能声明或定义变量、类型或其他函数

所以当你说
p2=“世界”
在函数之外,编译器在整个消除过程中都假定您必须声明一个变量,并且由于您没有给它指定类型,所以它假定您的意思是
int
。因此,您编写的代码相当于:

char*p1=“你好”;
char*p2;
int p2=“世界”//错误:使用不同类型重新定义“p2”:“int”vs“char*”

在这一点上,它应该很明显地告诉你为什么你要将
p2
重新定义为
int

,我只是在你发布的时候添加了一些文本,这有点像你的答案……谢谢你的回答,我现在清楚了。那很有帮助。如果没有给定类型,C隐式地假定一个变量
int
。globle作用域变量所能做的就是声明或定义。谢谢您的回复,现在
p2
可以随心所欲了。:)