2014-11-04 77 views
1

我正在学习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; 
} 

当我运行这个程序,我得到不同的地址ap。为什么?据我所知,a是指向数组的第零个元素的指针,而p是指向指针的指针。 a指向第零个元素的地址,但p呢?有没有地址的地址?

+1

a不是指针,a是数组。 p也不是一个指针,它也是一个数组。 – 2014-11-04 17:36:09

+0

@MooingDuck尽管 – 2014-11-04 20:19:50

回答

0

p指向的存储器包含块的第一位置:

{ a,a+1,a+2,a+3,a+4 } 

一个的存储器包含块的第一位置

{0,1,2,3,4} 

这两个因此指向不同的内存块。

P [0](或* P)和一个应具有相同的地址。

+0

有可能存在地址的地址,但它们都衰减到指向'printf'语句的指针? – 2014-11-04 16:08:33

+1

@LishaGuPta你需要在某处存储内存地址。你在哪里存储它? – Degustaf 2014-11-04 16:22:57

+0

如果它的合法性比&& a = 2也应该合法 – 2014-11-04 16:28:38

0

试想事情存储器被组织:

一个:含有5点的整数0至4的连续存储区包括 - 一个是一个数组,&a == &(a[0])(并且也是一样a

p为指针为int的数组:它依次含有5个指针的连续存储区。 p是一个数组,如p == &(p[0])。但是现在p[0]是一个包含地址a的指针。

所以p是包含的a的地址的存储区的地址:它实际上是一个地址

的所以当然地址:*p(或p[0])是一样的a**pa[0]。但对于任何数组p一样p[0]

+1

Nitpick:'p'(通常)被转换为指向其第一个元素的指针,从而产生指向包含**一个**指针的内存区域的指针。 **然而**,'&p'是不同的。它产生一个指向包含**五个**指针的内存区域的指针。 “p”和“&p”的类型不一样。 – 2014-11-04 16:54:15

+0

@NisseEngström:你是真的。它们具有相同的价值,但不代表相同的类型。 – 2014-11-04 17:31:47

1

的地址由位,并取得位的任何东西都可以放在内存中。记忆中的一切都有一个地址。

这并不意味着程序中的每个地址值在内存中都是。地址也可以是用作表达式一部分的临时值。

这同样适用于整数值。其中有些是在记忆中,有些则不是。你可以有这样的:

int i = 7; 
int *p = &i; 

,但你不能有这样的:

int *q = &7; 

i是一个变量存在于记忆的名称,你可以用&得到它的地址。值7存储在该地址。 &7不起作用,因为程序源代码中文字7的存在不足以导致运行时在存储器中存在值7。

在略多的技术术语,i左值7右值。前缀&运算符要求其操作数为左值,但不会生成左值结果。 &i是一个右值,就像7。这就是为什么&(&i)无效。

+0

Thankyou很棒! :)只要我underatand由你回答是&(&a)= 2是非法的,因为&a毕竟是一个十六进制整数,我们可以使用&与任何整数,因此它是非法的。 – 2014-11-04 17:25:29

1

将变量看作地址的别名。当你有

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

1

没有两个变量可以在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

相关问题