gpt4 book ai didi

c - 为什么我得不到数组第一个元素的值?

转载 作者:太空宇宙 更新时间:2023-11-04 01:37:27 26 4
gpt4 key购买 nike

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

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;
}

我为前 3 个打印语句获取数组 a 的第一个元素的地址,当我取消引用所有 3 个时,我只获取第四个和第五个打印语句的值,而不是第六个打印语句(附有注释)。

最佳答案

要记住的事情:

  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的值相同,但是,它是一个指向数组的指针,而不是指针第一个元素。因此,如果您将 1 添加到 &a&a + 1,您将超出此数组。

类似地,&a[0]a 是指向第一个元素的指针,将它们加 1 将得到数组的下一个元素(如果有数组中定义的项目超过 1 个)。即 (a+1)&a[0] + 1 从第一个元素指向下一个元素。现在,要取消引用它们,您可以使用:

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

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

如果像这个答案所说的那样,数组的名称是它的第一个元素的地址,那么 &a 就是第一个元素的地址。

这个疑问的答案既是“否”又是"is"。

  • 没有,因为没有地址之类的地址。
  • 要理解是,请考虑以下情况:

    想象一下,您有 10 盒巧克力,每盒包含 5 颗巧克力(在盒子内排成一行),并且这些盒子排成一行。

5 boxes of 5 chocolates each

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

在这里,So,盒子代表巧克力阵列。因此,我们有 5 盒,每盒 5 颗巧克力。声明将是:

将其翻译成 C,假设 a 是一个包含 5 个数字的数组。

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

  • 如果我让你知道第一个盒子里第一个巧克力的位置,那么你会用&a[0](a+0)a
  • 如果我要你告诉我第二 block 巧克力在第一个盒子里的位置,那么你会用 &a[1](a+1)a+1注意:在(a+1)中,由于a是数组名,所以是第一个元素的地址,即一个整数。所以,a加1,就是第二个元素的地址。
  • 如果我要你告诉我第二盒巧克力的位置,那么,你会把它称为 (&a+1)
  • 如果我要你告诉我第一 block 巧克力在第二盒巧克力中的位置,那么,你将把它称为 *(&a+1)* ((&a+1) + 0)
  • 如果我让你知道第三 block 巧克力在第二盒巧克力中的位置,那么,你会用 (*(&a+1))+2

关于c - 为什么我得不到数组第一个元素的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12033209/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com