数组基指针及其地址相同。 为什么?
考虑以下程序。
#include int main() { int a[10]={0}; printf("%p %p\n", a, &a); printf("%d %d\n", *a, *(&a)); return 0; }
a和&a是相同的。 但* a和*(&a)不是。 我没有答案。 请帮忙。
没有“数组基指针”,即没有指向数组的指针变量。 数组的名称是指数组本身 。 因此,您不能取a的地址,而是将&a
作为特例处理。
在表达式中使用数组的名称时,它会衰减为指向数组的第一个元素的指针。 但是, &
和sizeof
运算符是例外 。
ANSI C指定&a
表示数组本身的地址,其类型是“指向数组的指针”,而不是“指向数组元素的指针”。
在ANSI之前的编译器中,&a会引发警告。
a[i]
与*(a + i)
。 所以第一个元素与数组本身在同一个地址。
你可以在另一个问题上找到更详细的解释:SO: 为什么数组的地址等于它在C中的值?
数组的地址是您在C中早期学习的内容之一。缓冲区的地址是其第一个元素的地址。 如果是
printf("%d %d\n", *a, *(&a));
*a
取值a。
*(&a)
首先取一个地址,然后从中得到推论。
#include #include #include 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)语句。 更棘手的是当你想要修改指针指向的内容而不是内容时。
a
和&a
具有相同的值,但它们是不同的类型: int *
和int **
。 编译代码时应该收到警告。
如果您添加额外的*
您的第二行将起作用:
printf("%d %d\n", *a, **(&a));
这确实有意义:如果*a
取消引用a
并给出数组的第一个元素,并且&a
表示获取a的地址,则*(&a)
获取a的地址,取消引用,然后再次返回。