c - 为什么 p 不显示与 a 相同的地址?

标签 c arrays pointers memory-address

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

当我运行这个程序时,我得到了 ap 的不同地址。为什么?据我所知,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/

相关文章:

javascript - 比较两个数组,如果发现相同的键,则从第二个数组中获取值

c - malloc(sizeof(struct Node)) 与 malloc(sizeof(nodeptr)) 的不同行为

java - 对对象数组的引用是否指向同一数组的第一个元素?在java中

使用 strcpy() 函数的正确方法?

c - 发送两个字节的整数

C函数中的自赋值

c - 无论输入如何,输出相同

python - 大于阈值的元素的 numpy.argmin

PHP 爆炸和数组索引

c++ - 数组上的指针运算