指针的地址是什么(x2)?

3

让我们以以下示例为例,交换a和b的值。

void swap(int* a, int* b) {
    // remember, a and be are both memory addresses now!
    printf("The address of a is: %p\n", a);
    printf("The address of address-of a is: %p\n", &a);
    int tmp = *a;
    *a=*b;
    *b=tmp;
}

打印输出给我:

a的地址为:0x7ffd36e62d08
a的地址的地址为:0x7ffd36e62cd8

第二个printf语句具体告诉我们什么?例如:

int a = 4;
&a; // address-of a
int* b; = &a;
b; // address-of a
*b; // value-of a
&b; // address-of ...?

那只是在堆栈上的内存地址位置吗?


"&b" 是存储在堆栈上的指针变量 "b" 的地址。 - IrAM
3个回答

3
为了进一步解释Deduplicator的回答,我会将您的printf更改为以下内容:
printf("The _value_ of a is: %p\n", (void*)a);
printf("The address of a is: %p\n", (void*)&a);

(请参阅此问题了解为什么应该转换为void*。)

a是一个指针,和其他任何东西一样都有值,比如一个int或一个double。唯一的“区别”是,a的值是一个地址。在C中,所有的传递都是按值传递,因此当您将指针a传递给这个函数时,在函数中会复制它的值。指针值是一个指向int的地址。


2

这只是内存地址在堆栈上的位置吗?

是的,没错。


这个有用过吗?或者不是很常用,它有限制吗?例如,有人可以做&&&&&&&&a吗? - carl.hiass
@carl.hiass,那是无效的,请尝试并检查一下。 - IrAM

2
代码应该是这样的:
printf("The address a is: %p\n", a);
printf("The address of a is: %p\n", &a);

a是一个完全普通的对象,它的类型是指向整数的指针


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接