```
int y=5;
int *yPtr = nullptr;
yPtr = &y;

```

I understand that the pointer stores the address of y. and calling \*yPtr dereferences y.

If I have a call to the void function:

```
int main()
{
    int number = 5;
    function( &number );
}

void function( int *nPtr)
{
    *nPtr = *nPtr * *nPtr;
}

```

if the function takes a pointer as argument, how can the call to the function use an address?
I understand that nPtr stores addresses but why couldn't it be defined as. 

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

```

My main question would be: Why does a function receiving an address argument need a pointer parameter to receive the address?