int main()
{
int a[4][3] = {10,20,30,40,50,60,70,80,90,100,110,120};
printf("%d",((a==*a) && (*a==a[0])));
return 0;
}
在控制台上打印1。 任何人都有合理的解释吗?
答案 0 :(得分:11)
当在表达式中使用时,数组将转换为指针,除非它们是sizeof
和一元&
运算符的操作数。 a
和*a
属于不同类型(在衰减后)但具有相同的地址值。
a
衰减到指向数组的第一个元素(第一行)并且类型为int (*)[3]
。*a
取消引用a
指向的行,并进一步衰减指向第一行的第一个元素。它的类型为int *
。a[0]
表示第一行int [3]
类型。在表达式中,它衰减指向第一行的第一个元素,并在衰减后为int *
类型。
作为数组的地址,第一个字节的地址,因此数组的地址,第一行的地址和第一个元素的地址都具有相同的价值。因此,在衰减之后,a
,*a
和a[0]
的所有内容都指向同一位置。
以上是上述说明的图解视图:
Stack Overflow http://cdn.sstatic.net/stackoverflow/img/favicon.ico What exactly is the array name in c?
答案 1 :(得分:0)
是== * a?
The answer is yes if the array a is multi dimensional array.
那么如果它是单维的呢?让我举个例子。
void main()
{
int a[4]={1,2,3,4};
printf("%d",((a==*a)&&(*a==a[0])));
}
本案的答案是0。
这是因为' a'表示数组的地址或数组的第一个元素的地址,但*表示值(指向该值的指针)。地址和值是不同的类型,所以答案为0。