2016-01-07 2 views
6

Я хотел знать, существуют ли альтернативные способы присвоения указателю адреса значения, на которое указывает его значение. Например, есть обычный способ:присвоение адреса указателю

int a = 10; 
int *ptr; 
ptr = &a; 

, но в некоторых местах я вижу это, как заявил:

int *ptr = &a; 

ли оба эти пути эквивалент? Я немного смущен, потому что всегда считал * ptr как значение , а не адрес. Может ли кто-нибудь объяснить это? Благодарю.

+0

оба одинаковы только – kapil

+2

При написании 'int * ptr;' вы объявляете указатель. При написании * ptr вы присваиваете значение. Его деление, которое меняет смысл оператора * – loginn

+1

Вы также можете написать 'int a = 10, * ptr = & a;' :) Они то же самое –

ответ

9

Я немного смущен, потому что я всегда считал *ptr как давать значение a, а не адрес.

Это действительно немного запутанно, так как * используется для объявления указателя, а также используется как оператор разыменования. Фактическое значение * зависит от контекста - используется ли оно в объявлении, инициализации или присваивании.

Стоит знать различия между 1) декларацией, 2) инициализацией и 3) присвоением.

int *ptr; // 1) this is declaration without initialisation. 

int *ptr = &a; // 2) this is declaration **and** initialisation (initialise ptr to the address of variable a) 

int b = 10; 
*ptr = b; // 3) this is assignment, assign what pointed by ptr to value of variable b. 
  • В 1) * означает, что ptr является указателем на int (но не указал на любое действительное место еще).
  • В 2) * означает, что ptr является указателем на int, а его начальное значение является адресом переменной a.
  • В 3) * - это оператор разыменования, то есть присвоение значения, указанного на ptr значению переменной b.
+0

Спасибо за ответ! Я понимаю это намного лучше сейчас :) – QPTR

2

Нет .. это декларация и интилиация в одной строке.

Это очистит мысль ..

typedef int* intp; 

intp ptr=&a; 

Эквивалентное

intp ptr; //int *ptr; 
ptr=&a; // ptr=&a; 

Ответ: Да, они эквивалентны.

Вы можете задаетесь вопрос: - Как компилятор понять (как * это окольный или в объявлении)

Ans: - С контекстом sensitive..based от контекста, на котором он находится используемый компилятор решает это.

+0

Спасибо за ответ! :) – QPTR

+1

все в порядке ... @ QPTR .: – coderredoc

1

int *ptr; ptr = &a; является int *ptr = &a; как int n; n = 3; является int n = 3;.

Т.е. декларация указателя и инициализация ничем не отличаются от обычных переменных. Я предпочитаю использовать одну линию, когда это возможно, с тех пор существует меньшая опасность наличия неинициализированных переменных.

+0

Спасибо! Теперь, когда я знаю, что это кажется менее опасным для использования однострочного лайнера, он попытается использовать этот подход больше. – QPTR

1

Если оператор * используется во время объявления, он просто используется для указания типа объявляемой переменной. В то время как во всех других случаях оператор * используется как оператор разыменования (кроме случаев, когда он используется как оператор умножения).

Так int *ptr = &a означает ptr является переменной типа int *, который был назначен &a

И *ptr = a означает variable stored at address ptr (разыменования ptr), который в настоящее время назначен a.

+0

Спасибо за ответ! – QPTR

2

Оба эти способа эквивалентны?

Да.

Второй вариант немного предпочтительнее, поскольку первый оставляет ptr неназначенным до последней строки (хотя на практике компилятор, вероятно, оптимизирует это).

Я немного смущен, потому что всегда считал * ptr как значение a, а не адреса.

Вы сбиваете с толку синтаксис, объявляющий переменную синтаксисом для использования этой переменной.

int *ptr; 

просто объявляет переменную с именем ptr, который является указателем на целое число.

int *ptr = &a; 

делает то же самое. Первая часть - это всего лишь объявление указателя, как и раньше. Часть после знака равенства инициализирует ptr по адресу a

Вы правы, что после декларации при последующем использовании этой переменной в последующем коде с указанием *ptr даст вам содержимое указателя (в данном случае значение a).

+1

Большое спасибо за ответ, это помогло разобраться в концепции. Я не ожидал так много ответов, и каждый ответ помогает мне понять концепцию, поэтому не сможет принять ваш ответ. Но спасибо большое! :) – QPTR

+1

Без проблем @QPTR, я рад, что это помогло. – GrahamS

Смежные вопросы