присвоение адреса указателю
Я хотел знать, есть ли альтернативные способы присвоения указателю адреса значения, на которое он указывает. Например, есть обычный способ:
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
.