C 为什么全局指针可以';t重新指向另一个对象,但本地指针可以?
我是C新手,尤其是C指针新手。这里的问题很简单: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;
#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
可以随心所欲了。:)