2011-04-12 41 views
0

如果我已经建立像 INT标记的阵列[4] [2]; 则数组名称必须给我的第一个元素的地址,在一个维数组的情况下,但它是不是这样呢? &也
printf("%d",marks[0]); & printf("%d",marks); 产生相同的结果?????????关于二维阵列

+0

只是要清楚,你是说'的printf( “%d”,引号[0])'和'的printf(” %d“,标记)'给你不同的输出? – Nishan 2011-04-12 07:38:36

+0

是的,这就是我所说的。 – nobalG 2011-04-12 07:59:51

+0

@Alfred它打印什么? – anatolyg 2011-04-12 18:42:17

回答

2
printf("%d",marks); 

给人一种错误的格式说明符导致未定义行为marks导致指向1D数组的指针(即指向第一行的第一个元素的指针)。

因此,将指针的内容%p应改为使用。

printf("%p",marks); 

而且似乎您试图在一个位置打印值。所以 -

printf("%d",marks[0][0]); // [m][n] is the way of accessing 2D array elements. 
0

在C语言中,例如二维阵列被视为一维数组,其元素是一维arrays.So如果你想要得到的任何元素的地址,你将不得不使用

的printf(“% 8u \ n“,& a [i] [j]);

两个打印语句打印相同的结果,因为这两个标记和标记[0]是指向二维阵列的第一行的起始。

+0

这就是我所要求的,这两个不是给我同样的结果 – nobalG 2011-04-12 06:42:36

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 

所有指针到列表中的第一个元素(除了的第一个元素的零列表)。

0

当您在printf格式使用%d,相应的参数(后默认促销)必须有类型int。既然你在这两种情况下违反了这条规则,任何事情都可能发生

marks具有类型int[4][2]并衰减到int(*)[2],这不是int

marks[0]具有类型int[2]和衰减到int*,这是不int

(但我仍然感到惊讶的实际执行将输出不同的地址。)