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

时间:2012-05-09 11:44:16

标签: c++ c

考虑以下计划。

#include <stdio.h>

int main()
{
  int a[10]={0};

  printf("%p %p\n", a, &a);
  printf("%d %d\n", *a, *(&a));

  return 0;
}

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

4 个答案:

答案 0 :(得分:3)

a[i]*(a + i)相同。所以第一个元素与数组本身在同一个地址。

您可以在另一个问题上找到更详细的解释:How come an array's address is equal to its value in C?

答案 1 :(得分:1)

数组的地址是您在C中早期学到的东西之一。缓冲区的地址是其第一个元素的地址。在

的情况下
printf("%d %d\n", *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 %i\n %s %i\n %s %i\n", 
            "szBuffer's address: ", (int ) szBuffer,
            "&szBuffer[0]'s address: ", (int ) &szBuffer[0],
            "pBufferPtr's address: ", (int ) pBufferPtr);



    printf("\n%s\n", "Program ended.");

    return 0;
}

正如我多年前所了解的那样,有时用指针做的最好的事情是编写以前称为“存根”的代码,然后在调试器中查看或使用“print”(printf)语句。更棘手的是当你想要修改指针指向的内容而不是内容时。

答案 2 :(得分:1)

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

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

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

在ANSI之前的编译器中,&amp; a会引发警告。

答案 3 :(得分:0)

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

如果您添加这样的额外*,您的第二行将会有效:

printf("%d %d\n", *a, **(&a));

这确实有意义:如果*a取消引用a并给出数组的第一个元素,&a表示取a的地址,则{{1获取*(&a)的地址,取消引用 ,然后再次返回a