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

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

为什么价值观不同?

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

表达式&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; //initialization is not done *n = 20; 

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

除了那个部分,

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

所以,他们不同的,应该有不同的价值观。

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

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

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

在这段代码中,当我们以不同的方式限定ptr时,这里发生了什么以及找到了什么值。

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