C:为什么指针和&指针有不同的值?

时间:2015-02-09 20:35:33

标签: c pointers memory-address

如果我在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:1592302 512 ,n&:1592302 480

为什么不同的值?

4 个答案:

答案 0 :(得分:5)

  

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

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

但请注意,您有未定义的行为首先,因为您正在取消引用未初始化的指针。您需要将n指向可以写入的位置。

例如,

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

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

其次,printf的{​​{1}}说明符错误。您需要&n

%p

答案 1 :(得分:2)

在您的代码中

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

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

除了那个部分,

  • n的类型为int *
  • &n的类型为int **

所以,他们 不同,并且应该有不同的值。

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

答案 2 :(得分: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 :(得分:0)

作为替代方案,让我以不同的方式拼出这个。

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

在此代码中,当我们以不同方式限定ptr时,会发生什么以及找到什么值。

ptr本身包含char c变量所在的内存中的地址。 *ptr取消引用指针,返回变量c的实际值。在这种情况下,资本A. &ptr将为您提供ptr所代表的内存位置的地址。换句话说,如果你需要知道指针本身的位置而不是它所指向的地址是什么,这就是你得到它的方式。