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

C:为什么指针和&;指针有不同的值吗?,c,pointers,memory-address,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:1592302512,n&:1592302480 为什么代码中的值不同? i

如果我在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

为什么代码中的值不同?

     int* n; //initialization is not done
    *n = 20; 
调用未定义的行为。您正在尝试取消引用(写入)未初始化的内存。在取消引用之前,必须将内存分配给
n

除此之外,

  • n
    属于
    int*
  • &n
    将是
    int**
所以,他们是不同的,应该有不同的价值观

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

     int* n; //initialization is not done
    *n = 20; 
调用未定义的行为。您正在尝试取消引用(写入)未初始化的内存。在取消引用之前,必须将内存分配给
n

除此之外,

  • n
    属于
    int*
  • &n
    将是
    int**
所以,他们是不同的,应该有不同的价值观

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

为什么
指针
指针
有不同的值

表达式
&n
产生
n
本身的地址,而
n
计算为指针的值,即它指向的对象的地址

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

比如说,

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

// now you can de-reference n
*n = 20;
其次,
&n
printf
说明符错误。您需要
%p

printf("n: %i, &n: %p\n", n, &n);
为什么
指针
指针
有不同的值

表达式
&n
产生
n
本身的地址,而
n
计算为指针的值,即它指向的对象的地址

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

比如说,

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

// now you can de-reference n
*n = 20;
其次,
&n
printf
说明符错误。您需要
%p

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

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?

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?

作为另一种选择,让我用另一种方式来阐述这一点

char *ptr;
char c='A';
ptr = &c;
在这段代码中,当我们以不同的方式限定
ptr
时,发生了什么以及找到了什么值

ptr
本身包含
char c
变量所在的内存地址。
*ptr
取消对指针的引用,返回变量
c
的实际值。在这种情况下,大写字母a。
&ptr
将为您提供
ptr
表示的内存位置的地址。换句话说,如果您需要知道指针本身所在的位置,而不是它指向的对象的地址,那么这就是您获得它的方式。

作为一种替代方法,让我用另一种方式来解释它

char *ptr;
char c='A';
ptr = &c;
在这段代码中,当我们以不同的方式限定
ptr
时,发生了什么以及找到了什么值

ptr
本身包含
char c
变量所在的内存地址。
*ptr
取消对指针的引用,返回变量
c
的实际值。在这种情况下,大写字母a。
&ptr
将为您提供
ptr
表示的内存位置的地址。换句话说,如果您需要知道指针本身的位置,而不是它指向的对象的地址,那么这就是您获得它的方式。

为什么您希望它们是相同的?你认为
的效果是什么?为什么你认为它们是一样的?你认为
&
的效果是什么?@gio很好。乔:接得好。编辑。