2015-02-09 2 views
0

Если я бегу следующий на 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; 
} 

я получаю:

п: 1592302 , п &: 1592302

Почему различные значения?

+0

Почему вы ожидаете, что они будут такими же? Как вы думаете, эффект '&' есть? –

ответ

2

В коде

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

вызывает неопределенное поведение. Вы пытаетесь удалить ссылку (записать в) неинициализированную память. Перед де-ссылкой вам необходимо выделить память n.

Помимо формы, что часть,

  • n имеет тип int *
  • &n будет типа int **

Таким образом, они являются разные, и должны иметь разные значения.

Сказанное, вы должны использовать спецификатор формата %p с printf() для печати указателей.

4

Почему 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 –

+0

@gio Хороший улов. Ред. – juanchopanza

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? 
0

Так же, как альтернатива, дайте мне по буквам на это по-другому.

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

В этом коде, вот что происходит, и какие ценности обнаруживаются, когда мы рассматриваем ptr по-разному.

ptr сам содержит адрес в памяти, где находится переменная char c. *ptr разыменовывает указатель, возвращая действительное значение переменной c. В этом случае капитал A. &ptr предоставит вам адрес ячейки памяти, которую представляет ptr. Другими словами, если вам нужно знать, где находился указатель, а не тот адрес, на который он указывает, вот как вы его получите.