如果我创建了一个类似的数组
int marks [4] [2];
那么数组的名称必须给我第一个元素的地址,就像一维数组的情况一样,但事实并非如此?
&安培;也
printf("%d",marks[0]);
&
printf("%d",marks);
产生相同的结果??????????
答案 0 :(得分:2)
printf("%d",marks);
给出错误的格式说明符会导致未定义的行为。 marks
导致指向1D数组的指针(即指针指向第一行的第一个元素)。
因此,应该使用打印指针的内容%p
。
printf("%p",marks);
似乎您正在尝试在0*0
位置打印该值。所以 -
printf("%d",marks[0][0]); // [m][n] is the way of accessing 2D array elements.
答案 1 :(得分:1)
它对我来说表现如预期:
#include <stdio.h>
int main(int argC,char* argV[])
{
int marks[4][2]={0};
printf("%x %x %x\n"
"%x %x %x\n"
"%x %x\n",
marks,marks[0],marks[0][0],
*marks,&marks,**marks,
&marks[0],&marks[0][0]);
return 0;
}
有输出:
12ff44 12ff44 0
12ff44 12ff44 0
12ff44 12ff44
指向列表第一个元素的所有指针( 列表的第一个元素除外)。
答案 2 :(得分:0)
在C中,例如,一个二维数组被视为一维数组,其元素是一维数组。所以,如果你想得到你必须使用的任何元素的地址
的printf( “%8U \ n”,&安培;一个[i] [j]);
两个print语句都打印相同的结果,因为标记和标记[0]都指向二维数组的第一行的开头。
答案 3 :(得分:0)
当您以%d
格式使用printf
时,相应的参数(默认促销后)必须具有类型int
。既然你在这两种情况下都违反了规则,那么任何事情都可能发生。
marks
的类型为int[4][2]
,并且已衰减到int(*)[2]
,而不是int
。
marks[0]
的类型为int[2]
,并且已衰减到int*
,而不是int
。
(但我仍然感到惊讶,实际的实现会输出不同的地址。)