как использовать указатели в списке аргументов функций, какочень простой с вопросом
void f(int *);
это означает, что эта функция будет принимать указатель на целое число
но что это означает
void f(int ***);
и
void f(int **=0)
как использовать указатели в списке аргументов функций, какочень простой с вопросом
void f(int *);
это означает, что эта функция будет принимать указатель на целое число
но что это означает
void f(int ***);
и
void f(int **=0)
void f(int ***);
означает, что функция принимает указатель на указатель на указатель на int. Это будет работать с ним:
int x=42;
int *px=&x;
int **ppx=&px;
int ***pppx=&ppx;
f(pppx);
Теперь о 2-м один, его функции, которая принимает указатель на указатель на междунар, и если вы не дать ему ничего, то по умолчанию 0.
int x=42;
int *px=&x;
int **ppx=&px;
f(ppx); // pt to pt to x
f(); // same as f(0)
UPDATE:
практическое применение такого рода двойных указателей является распределение обычной памяти, как:
bool alloc(T **mem, int count);
Эта функция возвращает true
/false
в зависимости от того, или не работал он и будет обновлять указатель вы передаете в с реальным адресом памяти, как это:
T *mem;
verify(alloc(&mem, 100));
Проходите в неинициализированном указателе и функциях может перезаписать его с реальным значением, потому что вы передали указатель на фактический указатель. В конце mem
содержит указатель на действительную память.
Другое приложение, более распространенное, но гораздо менее просветительское, представляет собой массив массивов (так называемых зубчатых массивов).
+ 1 для очень четкого объяснения – peakit
да, я понял, но это не очень запутанный материал, который мы передаем указателю на указатель на указатель на указатель на функцию. это в основном используется в программировании или нет? –
См. Мое обновление для примера практического использования. – Blindy
void f(int ***);
Здесь f
принимает указатель к указателю на указатель на int
.
void f(int **=0)
Эта функция принимает указатель на указатель на int
в качестве аргумента, но это аргументы не является обязательным и имеет значение по умолчанию, равное 0 (т.е. нулевой)
int ***
является указатель на указатель на указатель на INT. Подумайте об этом как (((int*)*)*)
.
void f(int **=0)
Эта функция принимает указатель на Int указатель в качестве аргумента, но также может быть вызвана без аргументов, в этом случае аргумент будет 0.
Я понял, спасибо, что дал мне совет i.e (((int *) *) *). –
void f(int ***);
здесь аргумент функции является указателем к указателю на указатель на int (или, скорее всего, многим из них).
void f(int **=0)
и здесь это просто указатель на указатель на междунар который получает инициализируется быть 0 (указатель на ... 0, а не целое), если аргумент не задан, когда функция invoked (необязательный параметр).
void f(int ***);
Как объясняют другие ответы, это указатель на указатель на указатель на int. Он подсказывает мне, что программист был не очень хорошим программистом - он (и это был почти наверняка он) был слишком занят, показывая, насколько он умный с тремя уровнями косвенности, чтобы рассмотреть трудность сохранения слишком скрытого кода, подобного этому. Мне никогда не приходилось использовать 3 уровня косвенности примерно через 20 лет программирования на C и C++ и редко использовать 2.
Я видел этот синтаксис в вопросе, это очень запутывает, когда мы передаем аргументы функциям, например указатель на указатель на указатель на целое, на функцию –
, что вы говорите об использовании такого синтаксиса в программировании на C++? –
Sexist, unimaginative и снисходительно. Дал бы больше, чем -1, если бы мог. – Blindy
Что вы спрашиваете, это Multiple Indirection. Эта страница очень хорошо подводит итог этой проблеме, я настоятельно рекомендую прочитать эту целую страницу по указателям, она золотая.
Перемещенный вопрос как 'C', здесь нет ничего C++, хотя, конечно, C можно использовать в C++-файле. –
какой? значения параметра по умолчанию не являются C, но, вероятно, не повлияют на решение вообще ... –