Когда я вызываю функцию X, скажем, по: functionX (& randomvar), где randomvar - это целое число, содержащее определенное значение (скажем, 5), тогда C создаст указатель, который также называется 'randomvar ', который содержит адрес randomvar
Имя указателя в функции functionX
равно y
, потому что вы сами написали, что это имя параметра функции functionX(int *y)
.
Если это так, то когда функция имеет двойные указатели: functionX (int ** y) и, выполняя functionX (& randomvar), создает 2 указателя, один из которых содержит адрес randomvar, другой - адрес первый указатель Если у вас есть функция, объявленная, например, как
Оператор & создает один указатель, а не два указателя.
Если у вас есть функция, объявленная, например, как
void functionX(int **y);
и переменная, объявленная как
int randomvar = 5;
, тогда такой вызов функции, такой как
functionX( &randomvar );
, генерирует ошибку компиляции, потому что тип аргумента равен int *
, тогда как тип параметра в соответствии с объявлением функции: int **
.
Вы не можете писать, например, как
functionX( &&randomvar );
, потому что использование первого оператора &
создает временный объект типа int *. И вы не можете применять оператор & к временному объекту.
Для вызова функции вы можете написать
int *p = &randomvar;
functionX( &p );
В этом случае тип аргумента будет int **
, так как требуется типом параметра.
Вот демонстрационная программа.
#include <stdio.h>
void f( int *p )
{
printf( "The value of p is %p\n"
"the pointed value is %d\n",
( void * )p, *p );
}
void g( int **p )
{
printf( "The value of p is %p\n"
"the pointed value is also a pointer %p\n"
"the pointed value by the dereferenced pointer is %d\n",
( void * )p, ( void * )*p, **p );
}
int main(void)
{
int x = 5;
f( &x );
putchar( '\n' );
int *p = &x;
g( &p );
return 0;
}
Ее вывод может выглядеть, например, как
The value of p is 0x7ffced55005c
the pointed value is 5
The value of p is 0x7ffced550060
the pointed value is also a pointer 0x7ffced55005c
the pointed value by the dereferenced pointer is 5