【问题标题】:C: Why do pointer and &pointer have different values?C: 为什么指针和 &pointer 有不同的值?
【发布时间】:2015-02-09 20:35:32
【问题描述】:

如果我在 OS X 上运行以下命令:

int main (void)
{
    int* n; // initialise(declare) pointer
    *n = 20; // the value in address pointed to by n is 20
    printf("n: %i, n&: %i\n", n, &n);
    return 0;
}

我明白了:

n:1592302512,n&:1592302480

为什么会有不同的值?

【问题讨论】:

  • 你为什么期望它们是一样的?你觉得&的作用是什么?

标签: c pointers memory-address


【解决方案1】:

为什么pointer&pointer 有不同的值?

表达式&n 产生n 本身的地址,而n 计算为指针的,即它指向的东西的地址。

但请注意,您有未定义的行为首先,因为您正在取消引用未初始化的指针。你需要让n指向你可以写信的地方。

例如,

int* n;
int i = 42;
n = &i;

// now you can de-reference n
*n = 20;

其次,&nprintf 说明符有误。你需要%p:

printf("n: %i, &n: %p\n", n, &n);

【讨论】:

  • @gio 不错。已编辑。
【解决方案2】:

int* n 声明了一个名为n 的变量,它是一个指向整数的指针。
&n 返回变量n 的地址,它是一个指向整数的指针。

假设我们有以下代码:

int   a = 20;   // declare an integer a whose value 20
int*  n = &a;   // declare a pointer n whose value is the address of a
int** p = &n;   // declare a pointer p whose value is the address of n

在这种情况下,我们将有以下内容:

variable name |    value   | address in memory
      a       |     20     |    1592302512
      n       | 1592302512 |    1592302480
      p       | 1592302480 |    who knows?

【讨论】:

    【解决方案3】:

    在你的代码中

         int* n; //initialization is not done
        *n = 20; 
    

    调用未定义的行为。您正在尝试取消引用(写入)未初始化的内存。在取消引用之前,您必须为 n 分配内存。

    除了那部分,

    • nint * 类型
    • &n 将是 int ** 类型

    所以,它们不同的,应该有不同的值。

    也就是说,您应该使用%p 格式说明符和printf() 来打印指针。

    【讨论】:

      【解决方案4】:

      作为替代方案,让我换一种方式来拼写。

      char *ptr;
      char c='A';
      ptr = &c;
      

      在此代码中,当我们以不同方式限定 ptr 时,会发生以下情况以及发现的值。

      ptr 本身包含char c 变量所在的内存地址。 *ptr 取消引用指针,返回变量c 的实际值。在这种情况下,大写字母 A。 &ptr 会给你ptr 代表的内存位置的地址。换句话说,如果你需要知道指针本身的位置,而不是它所指向的东西的地址,这就是你获取它的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-16
        • 2022-06-19
        • 1970-01-01
        • 1970-01-01
        • 2011-10-24
        • 2021-04-17
        相关资源
        最近更新 更多