Но я не спрашивайте, зачем вам нужен отдельный адрес для этого
Вы не делаете, но существует адрес оператора, так что вы можете взять адрес указателя, который является то, что
printf("%p\n", &p);
печати.
А также, когда вы используете &p
Есть случаи, когда это может быть полезно, рассмотрим, например, что вам нужно передать указатель на функцию, которая может быть переназначен в функцию, вы может сделать что-то вроде этого
int allocateIntegerArray(int **pointerToPointer, size_t someSize)
{
if (pointerToPointer == NULL)
return 0;
*pointerToPointer = malloc(someSize * sizeof(int));
return (*pointerToPointer != NULL);
}
, то вы могли бы использовать этот Funciton следующим образом
int *pointer;
if (allocateIntergerArray(&pointer, 10) == 0)
{
fprintf(stderr, "Error, cannot allocate integer array\n");
/* do some extra cleanup or recover from this error, or exit() */
exit(0);
}
Сами указатели также являются переменными, и поэтому они должны быть сочтены где-то, поэтому адрес указателя указывает вам, где хранится указатель, это значение указывает вам, на что оно указывает.
Зная, где оно хранится, вы можете делать такие вещи, как описано выше.
'зачем вам нужен отдельный адрес?' - переменная 'p' находится в памяти, поэтому у нее есть адрес (по определению« что-то, что находится в памяти »). –