为什么数组打印有时值,有时地址?

时间:2014-08-15 00:40:51

标签: c arrays

你能解释为什么在第一个程序“array [counter]”打印值但在第二个程序“array [counter]”打印地址?

第一个程序

main()
{
    int array[ 4 ] = { 1, 2, 3, 4 };
    int counter;
    for( counter = 0 ; counter <= 3; counter++ )
        printf( "%u\n", array[ counter ]);
}

第二个计划

main()
{
    int array[ 4 ] [ 1 ]= { 1, 2, 3, 4 };
    int counter;
    for( counter = 0 ; counter <= 3; counter++ )
        printf( "%u\n", array[ counter ]);
}

6 个答案:

答案 0 :(得分:2)

在第二个例子中,array[counter]不是一个值,它是一个数组。

当你将一个数组作为参数传递给一个函数时,它会经历array to pointer decay,因此你得到一个指向数组开头的指针,而不是数组本身。

答案 1 :(得分:0)

在第二种情况下,array[counter]的类型为int [1],而在第一种情况下,array[counter]的类型为int

int [1]是一种数组类型,当您打印它时, 衰减 指向指向此数组起始地址的指针。这就是你打印时得到的东西。

答案 2 :(得分:0)

在第二个程序中,array是指向int列表的指针。在第一个程序中,array是指向int列表的指针。

因此,当您在第二个程序中取消引用array时,您会得到一个指向int列表的指针 - 换句话说,您将得到一个内存地址。同样,当您在第一个程序中取消引用array时,您将获得int列表中的第一个元素 - 换句话说,就是一个值。

答案 3 :(得分:0)

你的第一个例子通常是在循环中打印数组的所有四个元素,没什么特别的。


另一方面,你的第二个例子是错误的。

这定义了一个由4 {1}}组成的数组:

it

此订单int array[4][1] = { 1, 2, 3, 4 }; print though it gives a int[1]的值automatically decays输出到unsigned。 那是Undefined Behavior (UB),任何事情都可能发生(如果int*int大小相同,甚至可能会打印指针)。

int*

答案 4 :(得分:0)

首先,以下代码含义相同,因为格式字符串为“%u”:
1. printf(“%u \ n”,xxxx);
2. printf(“%u \ n”,(unsigned int)xxxx);

其次:
1.第一个程序中数组[counter]的类型为“int” 2.在第二个程序中,数组[counter]的类型是“int *”。

最后:
1.如果将“int”转换为“unsigned int”,您将获得值 2.如果将“int *”转换为“unsigned int”,您肯定会得到地址
我希望这能解决你的问题。

答案 5 :(得分:0)

int array[4][1]相当于int *array[4] 所以你将获得存储在数组中的地址。