你能解释为什么在第一个程序“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 ]);
}
答案 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]
所以你将获得存储在数组中的地址。