数组基指针及其地址相同.为什么

Array base pointer and its address are same. Why?

本文关键字:为什么 地址 指针 数组      更新时间:2023-10-16

请考虑以下程序。

#include <stdio.h>
int main()
{
  int a[10]={0};
  printf("%p %pn", a, &a);
  printf("%d %dn", *a, *(&a));
  return 0;
}
a

和 &a 是相同的。但 *a 和 *(&a) 不是。我没有答案。请帮忙。

a[i]

*(a + i)相同。因此,第一个元素与数组本身位于同一地址。

您将在SO上的另一个问题中找到更详细的解释:为什么数组的地址等于其在C中的值?

没有"数组基指针",即没有指向数组的指针变量。数组的名称是指数组本身。因此,您不能采用 a 的地址,而是&a作为特殊情况处理。

在表达式中使用数组名称时,数组名称将衰减为指向数组第一个元素的指针。但是,&sizeof运算符是例外

ANSI C 指定 &a 表示数组本身的地址,其类型是"指向数组的指针",而不是"指向数组元素的指针"。

在 ANSI 之前的编译器中,&a 会导致警告。

数组

的地址是你在C语言早期学到的东西之一。缓冲区的地址是其第一个元素的地址。在以下情况下:

printf("%d %dn", *a, *(&a));

*a取 a 的值。

*(&a)首先获取 A 的地址,然后从中尊重。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char szBuffer[100];
char *pBufferPtr = NULL;
int main(int argc, char *argv[])
{
    pBufferPtr = szBuffer;
    printf("%s %in %s %in %s %in", 
            "szBuffer's address: ", (int ) szBuffer,
            "&szBuffer[0]'s address: ", (int ) &szBuffer[0],
            "pBufferPtr's address: ", (int ) pBufferPtr);

    printf("n%sn", "Program ended.");
    return 0;
}

正如我多年前所学到的,有时使用指针的最佳方法是编写过去称为"存根"的代码,然后在调试器中进行检查或使用"print"(printf)语句。更棘手的是,当您想要修改指针指向的内容而不是其内容时。

a&a具有相同的值,但它们是不同的类型:int *int **。编译代码时应该收到警告。

如果您添加如下所示的额外*,您的第二行将起作用:

printf("%d %dn", *a, **(&a));

这确实是有道理的:如果*a取消引用a并给出数组的第一个元素,并且&a表示获取a的地址,则*(&a)获取a的地址,取消引用地址,并再次返回a