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

C 为什么数组有时打印值,有时打印地址?,c,arrays,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数组[4]

您能解释一下为什么在第一个程序中“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数组[4]={1,2,3,4};
整数计数器;

对于(counter=0;counter在第二种情况下,
array[counter]
的类型为
int[1]
,而在第一种情况下,
array[counter]
的类型为
int


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

在第二个示例中,
数组[计数器]
不是一个值,而是一个数组


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

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


因此,当你在第二个程序中解引用数组时,你会得到一个指向
int
s列表的指针——换句话说,你会得到一个内存地址。同样,当你在第一个程序中解引用数组时,你会得到
int
s列表中的第一个元素——换句话说,就是一个值。

ple通常在一个循环中打印阵列的所有四个元素,没有什么特别之处


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

这定义了一个4的数组1的数组它

int array[4][1] = { 1, 2, 3, 4 };
这命令
打印
以输出一个
无符号
的值,该值被设置为
int*

也就是说,任何事情都可能发生(如果
int
s和
int*
大小相同,甚至可能打印指针)


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

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

最后:
1.如果将“int”转换为“unsigned int”,则会得到值。
2.如果您将“int*”转换为“unsigned int”,您肯定会得到地址。


我希望这解决了您的问题。
int-array[4][1]
相当于
int*array[4]

因此,您将获得存储在数组中的地址。

如果这样做,则相同:
int*i[4];
printf(“%u”,i);
因为在第一个程序中,您有一个整数数组,而在第二个程序中,您有一个数组。请将第二个程序更改为使用数组[counter][0]你们会得到同样的结果。感谢你们所有人!我在阅读你们的评论时特别理解了Jim Balter.Array[counter]始终打印值,在第一个程序中,值是数字,在第二个程序中,值是包含数字的内部数组的地址。顺便说一句,如果使用gcc-Wall编译此文件,它将警告您,第二个程序中的初始值设定项缺少花括号…它应该是{{1}、{2}、{3}、{4}。此外,使用
int main(void)
代替
main()
,如果使用C99之前的编译器,则需要返回一个值。“首先”--错误;如果xxxx不是无符号int,则没有强制转换的版本是未定义的行为。“第二”--错误;数组[counter]的类型是int[4]。“最终”--错误;您得到了未定义的行为。在int比指针短的计算机上,您可能会得到地址的低位。更正:数组[counter]的类型是int[1]另一个更正:
printf(“%u\n”,xxxx)如果xxxx是一个可以表示为
无符号整数的整数,则定义了
。因此,如果
数组
包含负数,则定义不明确。同样,说这两个语句的意思相同是错误的。谢谢。你说得很清楚。但是如果整数比指针短,endianness也可能在指针到int的转换。我只是不知道如何验证。根据endianness,使用%u打印指针可以生成高阶位或低阶位,但将指针转换为较短的int类型并不取决于endianness,它只使用低阶位(在实际的现有实现中,C标准没有定义行为)。要进行验证,您需要访问具有不同端点的计算机。不,
array
在这两种情况下都不是指针…请学习此问题的基础知识,这一点在今天讨论得非常令人厌恶。仅仅因为数组转换为指向表达式上下文中其第一个元素的指针并不意味着数组就是指针。而且您必须e这两个程序颠倒过来了。是啊,有人答对了!令人沮丧的是,有多少人声称
array
array[count]
是指针。@JimBalter:只要
int
是非负的,这是允许的,也是定义良好的。
int
标准说“unsigned int参数被转换为unsigned octal(o)”,unsigned decimal(u)“…但在va_arg下,它表示“行为未定义,但以下情况除外:一种类型是有符号整数类型,另一种类型是相应的无符号整数类型,值在两种类型中都可表示…”…因此我猜您是对的。不过,这是一种不好的做法,而且“错误”从这个意义上说。@JimBalter:转换成某种有符号整数类型更有趣。。。
int array[4][1] = { 1, 2, 3, 4 };
printf( "%u\n", array[ counter ]);