1

考虑以下程序。

#include <stdio.h>

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

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

  return 0;
}

a 和 &a 是一样的。但是 *a 和 *(&a) 不是。我没有答案了。请帮忙。

4

4 回答 4

3

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

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

于 2012-05-09T11:45:17.900 回答
1

数组的地址是您在 C 中早期学习的内容之一。缓冲区的地址是其第一个元素的地址。如果是

printf("%d %d\n", *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 %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;
}

正如我多年前了解到的,有时对指针的最佳处理是编写过去称为“存根”代码的代码,然后在调试器中检查或使用“打印”(printf) 语句。更棘手的是当您想要修改指针指向的内容而不是其内容时。

于 2012-05-09T12:07:44.677 回答
1

没有“数组基指针”,即没有指向数组的指针变量。数组的名称是指数组本身。因此你不能取一个地址a,而是&a作为一个特例来处理。

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

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

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

于 2012-05-09T12:29:15.567 回答
0

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

如果您添加这样的额外内容,您的第二行将起作用*

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

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

于 2012-05-09T12:06:47.777 回答