数组基指针及其地址相同.为什么
Array base pointer and its address are same. Why?
请考虑以下程序。
#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
。
相关文章:
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 为什么指针不写入类的地址?
- 为什么 ulimit -v 在 Clang 的地址清理器下不起作用?
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 为什么未命名的结构内联变量在每个翻译单元中没有相同的地址?
- 为什么我可以将变量存储在不是其最小对齐方式的倍数的地址?
- 为什么C++总是显示十六进制内存地址,而不仅仅是整数?
- 为什么两个矢量元素的地址有这么大的差距?
- 如果 const 不分配内存,为什么我可以获取 const 的地址?
- 为什么同一个变量的内存地址不同?
- 为什么成员函数地址离自由函数这么远?
- 为什么我得到以下代码地址清理器:未知地址错误的SEGV
- 堆栈分配的类类型.为什么两个 ID 实例的地址相同?
- 为什么每次执行时函数的地址都不同?
- 为什么地址相同?
- 为什么存储在数组中的地址值与其自己的地址相同,它应该指向某个不同的地址(&arr[0])?
- 为什么 C++ 地址中的矢量无法通过原始指针访问
- 当查看FILE流的地址时,为什么地址与原始指针的地址大不相同
- 为什么地址运算符是C++类的默认成员,它是什么