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

问题描述:

如果我运行OS X以下几点:C:为什么指针和指针有不同的值?

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 ,正&:1592302和

为什么不同的价值观?

+0

你为什么期望他们是一样的?你认为'&'的作用是什么? – 2015-02-09 20:47:04

在你的代码

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

调用未定义的行为。你试图去引用(写入)未初始化的内存。在解除引用之前,您必须分配内存到n

除了形成部分,

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

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

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

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

表达&n产生的n本身的地址,而n计算结果为值指针的,即它指向事物的地址。

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

例如,

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

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

其次,你打错printf说明符&n。您需要%p

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

我认为他进一步使用不正确的说明符&n – 2015-02-09 20:56:22

+0

@gio良好的捕获。编辑。 – juanchopanza 2015-02-09 21:00:26

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表示的内存位置的地址。换句话说,如果你需要知道指针本身的位置,而不是它指向的地址是什么,这就是你如何得到它。