我正在学习 C 中数组中的指针。我真的很困惑指针数组到底是什么。看看这个例子-
#include<stdio.h>
int main()
{
static int a[] = { 0, 1, 2, 3, 4 };
int *p[] = { a, a+1, a+2, a+3, a+4 };
printf( "%p %p %p %d ", p, *p, a, *(*p));
return 0;
}
当我运行这个程序时,我得到了 a
和 p
的不同地址。为什么?据我所知,a
是指向数组第零个元素的指针,p
是指向指针的指针。 a
指向第零个元素的地址,但是 p
呢?有地址之类的地址吗?
最佳答案
地址由位组成,任何由位组成的东西都可以放在内存中。内存中的所有内容都有一个地址。
这并不意味着程序中的每个地址值都在内存中。地址也可以是用作表达式一部分的临时值。
这同样适用于整数值。其中一些在内存中,有些则不在。你可以这样:
int i = 7;
int *p = &i;
但你不能拥有这个:
int *q = &7;
i
是存在于内存中的一个变量名,可以通过&
获取它的地址。值 7 存储在该地址。 &7
不起作用,因为程序源代码中文字 7
的存在不足以导致值 7 在运行时存在于内存中。
用更专业的术语来说,i
是一个左值,7
是一个右值。前缀 &
运算符要求其操作数是左值,但它不会产生左值结果。 &i
是一个右值,就像 7
一样。这就是 &(&i)
无效的原因。
关于c - 为什么 p 不显示与 a 相同的地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26739472/