Установка адреса и инициализация указателя - PullRequest
4 голосов
/ 11 ноября 2009

Во-первых, я извиняюсь за мой плохой английский, это не мой родной язык.

Я впервые изучаю указатели, и я нашел что-то действительно странное.

В книге, которую я читаю, написано, что * маркер означает переменную, которую указывает 'pa'.

Но когда я пытаюсь инициализировать указатель

int a;
int *pA =&a;

(в данном случае они использовали *pA), а затем изменили его,

* рА = & а;

не работает, а

рА = & а; * * тысяча двадцать один

работает.

Итак, мой запрос "есть ли разница между инициализацией указателей и просто заменой?"

Ответы [ 4 ]

3 голосов
/ 11 ноября 2009
int a;

Распределяет целое число в стеке

int* pA = &a;

Это размещает указатель int на стек и устанавливает его значение так, чтобы оно указывало на a. '*' Является частью декларации.

*pA = &a;

В этом случае '*' - это оператор, который говорит «посмотрите, куда указывает pA», то есть на int. Затем вы пытаетесь установить для этого int адрес a, что недопустимо.

pA = &a;

Теперь это то же самое, что и второе утверждение. Он устанавливает значение pA, чтобы указать на.

1 голос
/ 11 ноября 2009

В C, "декларация имитирует использование" .

Когда вы объявляете указатель на int

int *pa;

вы можете видеть, что pa это int * или *pa это int.

Вы можете назначить указатели на int на pa, или вы можете назначить целые на *pa.
Вот почему после вышеприведенной декларации следующие утверждения «работают».

*pa = 42;
pa = &a;

В самом объявлении вы можете «преобразовать» его в определение, указав значение инициализации. Определение для объекта pa типа int*, а не для *pa.

int *pa = &a; /* initialize pa, which takes a `int*` */
pa = &b;      /* change `pa` with a different `int*` */
*pa = 42;     /* change the value pointed to by `pa` */
0 голосов
/ 11 ноября 2009

Да, когда вы впервые объявляете указатель, вы можете указать адрес памяти. Поскольку вы объявляете его как указатель, вы используете оператор *. Но повсюду, *pA означает получение значения, на которое ссылается этот указатель (а не фактический адрес). Это немного странно, но вы привыкаете к этому.

Итак, вы можете сделать это:

int a; 
int *pA = &a;

и вы можете сделать это:

pA = &a;

Но вы не можете сделать:

*pA = &a;

Потому что это говорит: «сделайте значение, указанное pA =, равным значению a».

Однако вы можете сделать это:

*pA = a;

И именно так вы устанавливаете значение, на которое указывает pA. Надеюсь, это несколько ясно.

0 голосов
/ 11 ноября 2009

Когда вы создаете указатель, вы используете

int *pA;

Впоследствии использование *pA означает, что вы получаете доступ к значению , на которое указывает указатель .

Когда вы используете &a, вы используете Address-of Operator , который возвращает адрес ячейки памяти, в которой хранятся данные, хранящиеся в переменной a (которая является целым числом) .

Итак, правильное назначение - pA = &a, поскольку вы копируете адрес с a на pA, который должен содержать адреса ячеек памяти.

Но *pA представляет значение в этой ячейке памяти (целое число), поэтому неправильно присваивать адрес *pA - поэтому правильный синтаксис pA = &a.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...