указатель аргумента получения адреса в с ++?

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;
}

Мой главный вопрос: зачем функции, получающей аргумент адреса, нужен параметр указателя для получения адреса?

1

Решение

Используя параметр передачи по ссылке, вы заставляете свою функцию не копировать значение самого параметра, вместо этого использовать фактическую переменную, которую вы предоставляете. Итак, для более четкого представления см. Ниже:

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

Как правило, вы можете считать, что ссылки представляют разные для одного и того же блока памяти.

2

Другие решения

ты имел ввиду

void functions (int &ref)
{
ref = ref * ref;
}

это то, как вы используете ссылки, избегая синтаксиса всех ‘*’ указателей

0

Это еще одна из тех странных вещей C ++. Передача по ссылке отличается от передачи указателя. Когда вы делаете что-то вроде

void functions (int &ref)

Вы можете передать фактические переменные в functions (а не указатели на них), как

int a = 12;
functions(a);

А внутри функции вам не нужно разыменовывать. Обратите внимание, что вы проходите от ссылка, а не прохождение ссылка.

Когда вы передаете ссылку или указатель на что-то, вы используете звезду как таковую

void function( int *nPtr)

И поэтому вы должны разыменовать с *

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

-1
По вопросам рекламы [email protected]