2010-01-16 4 views
3

как использовать указатели в списке аргументов функций, какочень простой с вопросом

void f(int *); 


это означает, что эта функция будет принимать указатель на целое число
но что это означает

void f(int ***); 

и

void f(int **=0) 
+0

Перемещенный вопрос как 'C', здесь нет ничего C++, хотя, конечно, C можно использовать в C++-файле. –

+0

какой? значения параметра по умолчанию не являются C, но, вероятно, не повлияют на решение вообще ... –

ответ

15
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 содержит указатель на действительную память.

Другое приложение, более распространенное, но гораздо менее просветительское, представляет собой массив массивов (так называемых зубчатых массивов).

+0

+ 1 для очень четкого объяснения – peakit

+0

да, я понял, но это не очень запутанный материал, который мы передаем указателю на указатель на указатель на указатель на функцию. это в основном используется в программировании или нет? –

+0

См. Мое обновление для примера практического использования. – Blindy

4
void f(int ***); 

Здесь f принимает указатель к указателю на указатель на int.

void f(int **=0) 

Эта функция принимает указатель на указатель на int в качестве аргумента, но это аргументы не является обязательным и имеет значение по умолчанию, равное 0 (т.е. нулевой)

5
int *** 

является указатель на указатель на указатель на INT. Подумайте об этом как (((int*)*)*).

void f(int **=0) 

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

+0

Я понял, спасибо, что дал мне совет i.e (((int *) *) *). –

1
void f(int ***); 

здесь аргумент функции является указателем к указателю на указатель на int (или, скорее всего, многим из них).

void f(int **=0) 

и здесь это просто указатель на указатель на междунар который получает инициализируется быть 0 (указатель на ... 0, а не целое), если аргумент не задан, когда функция invoked (необязательный параметр).

+0

Что такое C-стандарт? Я получаю синтаксическую ошибку при компиляции прямо или с -std = c99. – jdizzle

+0

Первая строка должна работать с любым компилятором C, но вторая на самом деле не C, а C++ и, следовательно, работает только с компилятором C++. – x4u

-3
void f(int ***); 

Как объясняют другие ответы, это указатель на указатель на указатель на int. Он подсказывает мне, что программист был не очень хорошим программистом - он (и это был почти наверняка он) был слишком занят, показывая, насколько он умный с тремя уровнями косвенности, чтобы рассмотреть трудность сохранения слишком скрытого кода, подобного этому. Мне никогда не приходилось использовать 3 уровня косвенности примерно через 20 лет программирования на C и C++ и редко использовать 2.

+0

Я видел этот синтаксис в вопросе, это очень запутывает, когда мы передаем аргументы функциям, например указатель на указатель на указатель на целое, на функцию –

+0

, что вы говорите об использовании такого синтаксиса в программировании на C++? –

+1

Sexist, unimaginative и снисходительно. Дал бы больше, чем -1, если бы мог. – Blindy

1

Что вы спрашиваете, это Multiple Indirection. Эта страница очень хорошо подводит итог этой проблеме, я настоятельно рекомендую прочитать эту целую страницу по указателям, она золотая.

Смежные вопросы