是== * a ??关于指针的查询

时间:2014-07-11 12:31:00

标签: c arrays pointers

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。 任何人都有合理的解释吗?

2 个答案:

答案 0 :(得分:11)

当在表达式中使用时,数组将转换为指针,除非它们是sizeof和一元&运算符的操作数。 a*a属于不同类型(在衰减后)但具有相同的地址值。

  
      
  • a衰减到指向数组的第一个元素(第一行)并且类型为int (*)[3]
  •   
  • *a取消引用a指向的行,并进一步衰减指向第一行的第一个元素。它的类型为int *
  •   
  • a[0]表示第一行int [3]类型。在表达式中,它衰减指向第一行的第一个元素,并在衰减后为int *类型。
  •   

作为数组的地址,第一个字节的地址,因此数组的地址,第一行的地址和第一个元素的地址都具有相同的价值。因此,在衰减之后,a*aa[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。

  • 但是对于多维阵列' a'表示为[0] [0],因为它表示指向多维数组的第一个子数组的第一个元素的指针  如果数组是多维数组
  • ,答案是肯定的