c变量范围
如果在块中定义了变量,它是仅存在于块中还是整个程序中? 例如
main() { int j=5; { int i=10 printf("%d",i); } printf("%d , %d ",i,j); }
它有效吗?
main() { int j=5, *k; { int i=10 printf("%d",i); } k=&i printf("%d , %d ",*k,j); }
因为变量保留在内存中,从它的声明点到函数退出点?
非全局变量的作用域仅限于它定义的块。此外,对于自动变量,一旦块结束,变量的生命周期就结束了。
考虑这个愚蠢的例子:
void doit() { int *ps; int *pa; { static int s = 1; int a = 2; ps = &s; pa = &a; } // cannot access a or s here because they are out of scope // *ps is okay because s is static so it's lifetime is not over // *pa is not okay because a's lifetime ends at the end of the block }
你的第二个printf行将无法编译,因为i
不在范围内。
它只能在块中访问,因此在您的示例中,第二个printf()
是非法的,不会编译。
是的,它的范围仅限于它所在的区块。
i的范围仅限于声明它的块内。 在你的情况下它是
{ int i=10 printf("%d",i); }
因此,我无法在此范围之外访问
此问题还与您关于本地范围或自动变量的问题有关。 范围可以定义为定义此变量的模块。
并且模块可以是function或文件。
因此,您可以在文件中声明一个自动变量 – 这意味着它可以被该文件中的每个函数访问,或者换一种方式 – 在这种情况下,它的作用域被定义为文件。
如果将相同的变量声明为auto,但在函数内,则意味着只能在该函数中访问它 – 或者在此情况下将其范围定义为函数。
将auto视为模块中的“本地”(模块可以是函数或文件)。
在上面的示例中,您已通过添加大括号来定义范围,因此变量i
的范围已本地化到大括号内,这就是您在大括号外部访问受限的原因。