2013-08-14 2 views
3

Я читал программу, и я нашел эту функцию:как я могу использовать пустое ** функции (вакуум **)

void** function(void**) 

Мой вопрос, какой тип параметра я могу дать и что должна моему возвращаемое значение быть?

* ОБНОВЛЕНИЕ !!! *

Я могу прочитать его, и я знаю, что это может быть указатель указателя на любой тип вопроса, как его использовать? (Я только что редактировал заголовок) заранее!

+0

Указатель на указатель пустоты? – jrok

+0

Возвращает указатель на указатель на void. –

+0

Да, но как я могу использовать его – Engine

ответ

7

Объявление функции:

void **functionName(void**); 

... читается как: "functionNameэто функция, которая передается двойной указатель недействительным и возвращает указатель двойной пустоты ". Он передается двойным указателем void и возвращает указатель двойной пустоты.

Очень часто встречаются указатели void в универсальных ADT, сравниваются функции, разрушаются функции и т. Д. (Оставим эту деталь, но это важно - упомянуто в комментариях OPs).

Пример (без функции бы бессмысленно):

Рассмотрим это в качестве массива. Предположим, что вы хотите изменить первый элемент как строку «Hai», как против «Hello» (это слишком стильно).

char *arr_of_str[] = { "Hello", "Hi", "Hey", "Howdy" }; 

... то ваша функция, которую мы бы следующим образом:

void **functionName(void** ptr) { 
    char **ptr_char = ptr; 

    (*ptr_char)[ 0 ] = "Hai"; 

    return ptr; 
} 
4

Это функция, которая берет указатель на указатель на void и возвращает указатель на указатель на void.

Вы могли бы использовать его как это:

int something = 5; 
void* somepointer = &something; 

functionName(&somepointer); 
1

void * может ссылаться на адрес любого типа. Вы можете прочитать его как: «указатель на что-то в памяти». Таким образом, это означает, что он может указывать на целое число, строку, объект, ... все. Некоторые примеры:

void *anyObject; 
int a = 1; 
float b = 2; 
char *c = "somestring"; 

function aFunction(int a) 
{ 
    ... 
} 

anyObject = &a; 
anyObject = &b; 
anyObject = &c; 
anyObject = &aFunction; 

Это все действительные задания.

Чтобы вернуться к вашему вопросу: a void ** является указателем на указатель на void; на правильном английском языке: он указывает на место в памяти, где хранится значение void *. Продолжая из приведенного выше примера:

void **p; 
p = &anyObject; 

В общем, void * опасны, потому что они не типобезопасны. Чтобы использовать их, вы ДОЛЖНЫ использовать их для известного типа. И компилятор не будет жаловаться, если вы примените его к чему-то незаконному.

Хорошо, как вы его используете? Ну, на это трудно ответить, потому что мы не можем извлечь из декларации, какие типы ожидаются.Кроме того, возможно, что эти функции выделяют память внутри функции и возвращают ее внутри параметра. Но общий принцип: возьмите адрес (&) «указатель на что-то» и передайте его функции.

int a = 0; 
int *pa = &a; 
functionName(&pa); 
Смежные вопросы