【问题标题】:What is the address of a pointer (x2)?指针 (x2) 的地址是什么?
【发布时间】:2021-01-31 02:24:39
【问题描述】:

让我们看下面的例子,我们交换 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
address-of 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 存储在堆栈中的地址

标签: c pointers


【解决方案1】:

为了进一步扩展 Deduplicator 的答案,我会将您的 printf 更改为:

printf("The _value_ of a is: %p\n", (void*)a);
printf("The address of a is: %p\n", (void*)&a);

(请参阅 this question 了解为什么应该转换为 void*)。

a 是一个指针,其值与其他任何东西一样,例如intdouble。唯一的“区别”是,a 的值是一个地址。 C 中的所有内容都是按值传递的,因此当您将指针 a 传递给此函数时,会在函数中生成其值的本地副本。指针值是指向int的地址。

【讨论】:

    【解决方案2】:

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

    没错。

    【讨论】:

    • 那个用过吗?或者不是真的,它有限制吗?例如,有人可以做 &&&&&&&&a 吗?
    • @carl.hiass 无效,试试看
    【解决方案3】:

    代码应该是:

    printf("The address a is: %p\n", a);
    printf("The address of a is: %p\n", &a);
    

    a是一个完全正常的对象,其类型是指向int的指针

    【讨论】:

      猜你喜欢
      • 2022-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-03
      • 2021-01-03
      • 2016-02-08
      • 1970-01-01
      • 2016-03-13
      • 1970-01-01
      相关资源
      最近更新 更多