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的范围已本地化到大括号内,这就是您在大括号外部访问受限的原因。