int y=5;
int *yPtr = nullptr;
yPtr = &y;
Я понимаю, что указатель хранит адрес у. и вызов * yPtr разыменовывается y.
Если у меня есть вызов функции void:
int main()
{
int number = 5;
function( &number );
}
void function( int *nPtr)
{
*nPtr = *nPtr * *nPtr;
}
если функция принимает указатель в качестве аргумента, как вызов функции может использовать адрес?
Я понимаю, что nPtr хранит адреса, но почему его нельзя определить как.
void functions (int &ref)
{
ref = ref * ref;
}
Мой главный вопрос: зачем функции, получающей аргумент адреса, нужен параметр указателя для получения адреса?
Используя параметр передачи по ссылке, вы заставляете свою функцию не копировать значение самого параметра, вместо этого использовать фактическую переменную, которую вы предоставляете. Итак, для более четкого представления см. Ниже:
void function( int number )
{
cout << number;
}
function( myInt ); // function will copy myInt, into its local variables stack
но, используя метод передачи по ссылке, вот так:
void function ( int & number )
{
cout << number
}
function( myInt ); // function will not copy myInt into its local variables stack, instead, it will use the already existent myInt variable.
Нет никакой разницы в том, как компилятор будет работать с параметрами передачи по указателю и передачи по ссылке. Вместо этого вызов вашей функции будет выглядеть так:
void function_p( int *number )
{
cout << *number;
}
void function_r( int & number )
{
cout << number;
}
// and the calls
function_p( &myInt ); // it is required to use address-of operator here
function_r( myInt ); // the effect will be the same, but with less effort in writing that address-of operator
В C ++ 11 программисты начали использовать метод передачи по ссылке, как правило, как правило, потому что он имеет более простой для написания «шаблон».
Чтобы завершить ответ на ваш вопрос, *
а также &
операторы ссылаются только на тип параметра, поэтому они создают составные типы. Составной тип — это тип, который определяется в терминах другого типа. C ++ имеет несколько составных типов, два из которых являются ссылками и указателями.
Вы можете понять, что они влияют только на тип переменной (в нашем случае, на параметр), написав их надлежащим образом:
int* p1; // we will read this: pointer p1 points to an int
int* p2 = &var1; // we read this: pointer p2 points to int variable var1
int var1 = 12;
int& ref1 = var1; // and we read this: ref1 is a reference to var1
Как правило, вы можете считать, что ссылки представляют разные для одного и того же блока памяти.
ты имел ввиду
void functions (int &ref)
{
ref = ref * ref;
}
это то, как вы используете ссылки, избегая синтаксиса всех ‘*’ указателей
Это еще одна из тех странных вещей C ++. Передача по ссылке отличается от передачи указателя. Когда вы делаете что-то вроде
void functions (int &ref)
Вы можете передать фактические переменные в functions
(а не указатели на них), как
int a = 12;
functions(a);
А внутри функции вам не нужно разыменовывать. Обратите внимание, что вы проходите от ссылка, а не прохождение ссылка.
Когда вы передаете ссылку или указатель на что-то, вы используете звезду как таковую
void function( int *nPtr)
И поэтому вы должны разыменовать с *
Обратите внимание, что вы получить ссылку к переменной (или константе), поставив &
перед ним, но ты объявлять ссылка или указатель, поставив *
перед ней. В то же время вы разыменовываете указатель также, помещая *
перед ней.