当内部块具有相同的变量声明时,如何访问内部块中的外部块变量?

时间:2010-10-07 14:24:27

标签: c

int main(int argc, char** argv) {
    int i=5;
    {
        int i=7;
        printf("%d\n", i);
    }
    return 0;
}

如果我想访问i中的外int i=5printf)值,那该怎么办呢?

7 个答案:

答案 0 :(得分:8)

C99标准的相关部分,第6.2.1节(标识符的范围):

  

4 [...]如果标识符指定同一名称空间中的两个不同实体,则范围可能会重叠。如果是这样,一个实体(内部范围)的范围将是另一个实体(外部范围)范围的严格子集。在内部范围内,标识符指定在内部范围内声明的实体;在外部范围内声明的实体在内部范围内隐藏(并且不可见)。

更新

防止pmg's answer消失:您可以通过在隐藏发生之前声明指向它的指针来访问外部块变量:

int i = 5;
{
    int *p = &i;
    int i  = 7;
    printf("%d\n", *p); /* prints "5" */
}

当然,永远不需要提供这样的隐藏变量,而且风格总是不好。

答案 1 :(得分:4)

将外部i存储在另一个变量中,然后声明内部i。像 -

int i = 5;
{
    int p = i;
    int i  = 7;
    printf("%d\n", p); /* prints "5" */
}

答案 2 :(得分:3)

重命名变量。

答案 3 :(得分:2)

您无法访问它。

答案 4 :(得分:1)

我不明白为什么你不能称呼'我'和'J'。

它们的不同名称允许您选择。

答案 5 :(得分:1)

在定义新i之前,指向旧{{1}}。 (在http://ideone.com/dobQX演示)

但我最喜欢乔纳森的评论!

答案 6 :(得分:0)

简短的回答:你做不到。它被内部范围中的i隐藏。