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