为什么p不显示与a相同的地址?
我正在学习C中的数组中的指针。我真的很困惑,指针的数组究竟是什么。看看此例 -为什么p不显示与a相同的地址?
#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
呢?有没有地址的地址?
p指向的存储器包含块的第一位置:
{ a,a+1,a+2,a+3,a+4 }
一个点的存储器包含块的第一位置
{0,1,2,3,4}
这两个因此指向不同的内存块。
P [0](或* P)和一个应具有相同的地址。
有可能存在地址的地址,但它们都衰减到指向'printf'语句的指针? – 2014-11-04 16:08:33
@LishaGuPta你需要在某处存储内存地址。你在哪里存储它? – Degustaf 2014-11-04 16:22:57
如果它的合法性比&& a = 2也应该合法 – 2014-11-04 16:28:38
试想事情存储器被组织:
一个:含有5点的整数0至4的连续存储区包括 - 一个是一个数组,&a
== &(a[0])
(并且也是一样a
)
p为指针为int的数组:它依次含有5个指针的连续存储区。 p是一个数组,如p == &(p[0])
。但是现在p[0]
是一个包含地址a
的指针。
所以p
是包含的a
的地址的存储区的地址:它实际上是一个地址
的所以当然地址:*p
(或p[0]
)是一样的a
和**p
是a[0]
。但对于任何数组p
是不一样p[0]
Nitpick:'p'(通常)被转换为指向其第一个元素的指针,从而产生指向包含**一个**指针的内存区域的指针。 **然而**,'&p'是不同的。它产生一个指向包含**五个**指针的内存区域的指针。 “p”和“&p”的类型不一样。 – 2014-11-04 16:54:15
@NisseEngström:你是真的。它们具有相同的价值,但不代表相同的类型。 – 2014-11-04 17:31:47
的地址由位,并取得位的任何东西都可以放在内存中。记忆中的一切都有一个地址。
这并不意味着程序中的每个地址值在内存中都是。地址也可以是用作表达式一部分的临时值。
这同样适用于整数值。其中有些是在记忆中,有些则不是。你可以有这样的:
int i = 7;
int *p = &i;
,但你不能有这样的:
int *q = &7;
i
是一个变量存在于记忆的名称,你可以用&
得到它的地址。值7存储在该地址。 &7
不起作用,因为程序源代码中文字7
的存在不足以导致运行时在存储器中存在值7。
在略多的技术术语,i
是左值和7
是右值。前缀&
运算符要求其操作数为左值,但不会生成左值结果。 &i
是一个右值,就像7
。这就是为什么&(&i)
无效。
Thankyou很棒! :)只要我underatand由你回答是&(&a)= 2是非法的,因为&a毕竟是一个十六进制整数,我们可以使用&与任何整数,因此它是非法的。 – 2014-11-04 17:25:29
将变量看作地址的别名。当你有
int v1 = 10;
v1
是用于保存10
地址的别名。
当你有:
int* v2 = &v1;
v2
是用于保存的v1
地址的地址的别名。
的地址可以认为,也可以是其他地址或原始数值,例如int
S,char
S等
要回答你的问题的值,
有没有像地址的地址什么?
严格地说,答案是否定的。但是,如果您有:
int** v3 = &v2;
然后,v3
是有其具有具有int
作为其值的地址值的地址值的地址别名。
在你的情况,
static int a[] = { 0, 1, 2, 3, 4 };
int *p[] = { a, a+1, a+2, a+3, a+4 };
a
是一个数组,的int
秒的阵列。在表达式中使用时,它将衰减为一个指针。 a
,a+1
等评估为指向int
s。
p
也是一个数组,数组为int*
s。在表达式中使用时,它将衰减为一个指针。 p
,p+1
等评估为指向int*
s的指针。
p
评估的地址为int*
-a
。a
评估的地址为int
- 0
。
*p
评估为a
。 *a
评估为0
。
没有两个变量可以在C.
阵列a
和阵列p
是变量具有相同的地址。所以他们必须有不同的地址。
下面是另一个例子:
int x[3] = { 0, 1, 2 } ;
int y[3] = { 0, 1, 2 };
printf("%p %p\n", &x , &y);
这都没有区别,在您的示例中的数组存储不同的数据类型比int
。
此外,数组的第一个元素始终驻留在阵列的开始,所以输出x
(其衰减到&x[0]
当您尝试打印它的值)将得到相同的结果&x
。
a不是指针,a是数组。 p也不是一个指针,它也是一个数组。 – 2014-11-04 17:36:09
@MooingDuck尽管 – 2014-11-04 20:19:50