присвоение адреса указателю

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

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

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

int *ptr = &a;

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

5 ответов


я немного смущен, потому что я всегда считал *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.

нет ..это объявление и intiliaziation в одной строке.

Это понятно, идея..

typedef int* intp;

intp ptr=&a;

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

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

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

Вы можете спросить- :- как компилятор поймет?(является ли * косвенным или как в декларации)

Ans: - c зависит от контекста..на основе контекста, в котором он используется, компилятор решает это.


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

да.

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

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

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

int *ptr;

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

int *ptr = &a;

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

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


int *ptr; ptr = &a; Это int *ptr = &a; as int n; n = 3; это int n = 3;.

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


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

так int *ptr = &a означает ptr - это переменная типа int * который был назначен &a

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