为什么我没有得到数组的第一个元素的值?

1 c

在这个程序中,我提到的所有三个地址都引用了数组的第一个元素但是为什么在我取消引用它时我不能得到数组的第一个元素的值?

int main()  
{  
    int a[5] = {1,2,3,4,5};  
    printf("address a = %d\n",a);  
    printf("address of a[0] = %d\n",&a[0]);  
    printf("address of first element = %d\n",&a);  
    printf("value of first element of the array a =%d\n",*(a));  
    printf("first element =%d\n",*(&a[0]));  
    printf("a[0] = %d\n",*(&a));//this print statement again prints the address of a[0] 

    return 0;  
}
Run Code Online (Sandbox Code Playgroud)

我得到a前3个打印语句的数组的第一个元素的地址,当我取消引用所有3个我得到的值仅用于第四和第五个打印语句而不是第六个打印语句(伴随注释).

God*_*Man 5

要记住的事情:

  1. 数组的名称是其第一个元素的地址

因此,当数组名称是a时,打印a会给你地址a[0](也是数组的地址),即你将得到&a[0](相同a)的值并且&a是相同的

现在,您知道a&a[0]参考第一个元素,您可以通过3种方式取消引用第一个元素: -

  • *a
  • *(&a[0])
  • a[0] - 请注意,在内部,这会转换为: *(a+0)

要记住的事情:

   2.向指针添加整数会将指针指向下一个元素

这里,&a指向整个数组的地址.虽然值&a&a[0]和相同a,但是,它是指向数组的指针,而不是指向第一个元素的指针.所以,如果你向&aie 添加1 &a + 1,你将超越这个数组.

SImilarly,as &a[0]a指向第一个元素的指针,向它们添加1将为您提供数组的下一个元素(如果数组中定义了多个项目).ie (a+1)&a[0] + 1指向第一个元素的下一个元素.现在,要取消引用它们,您可以使用:

  • *(a+1)
  • *(&a[0] +1)
  • a[1] - 请注意,在内部,这会转换为: *(a+1)

添加更多信息以消除以下疑问:

如果,如此答案所述,数组的名称是其第一个元素的地址,那么&a将是第一个元素的地址.

这个疑问的答案是否和是.

  • 不,因为没有地址的地址.
  • 为了理解是,请考虑以下情况:

    想象一下,你有10盒巧克力,每盒包含5个巧克力(盒子内的一条线),盒子排成一行.

每箱5盒5个巧克力

好的,足够的巧克力来解释.

在这里,所以,框表示巧克力的数组.因此,我们每人有5盒5个巧克力.声明如下:

将其转换为C,假设这a是一个包含5个数字的数组.

- 现在,如果我要求你告诉我第一个盒子的位置,那么你将把它称为&a.如果我让你给我第二个盒子的位置,那么,你会把它称为&a +1.

  • 如果我要求你在第一个盒子里给我第一块巧克力的位置,那么你会把它称为&a[0](a+0)a.
  • 如果我让你在第一个盒子里给我第二块巧克力的位置,那么你会把它称为&a[1](a+1)a+1.注意:在(a+1)作为a是阵列的名称,它是第一个元素,它是一个整数的地址.因此,增加a1表示第二个元素的地址.
  • 如果我让你给我第二盒巧克力的位置,那么,你会把它称为 (&a+1)
  • 如果我让你告诉我第二盒巧克力中第一块巧克力的位置,那么,你会把它称为*(&a+1)*((&a+1) + 0)
  • 如果我让你告诉我第二盒巧克力中第三块巧克力的位置,那么,你会把它称为 (*(&a+1))+2