как мы передаем адрес int * функции, которая использует void ** в качестве параметра? - PullRequest
0 голосов
/ 01 июля 2019

Я сделал стек ADT, используя указатели void. вот основные и queueFront функции-

bool queueFront(QUEUE *queue, void **itemPtr){
    if(queue->count == 0)
        return false;

    *itemPtr = queue->front->dataPtr;
    return true;
}

int main(){
    QUEUE *queue = createQueue();
    int *x = new int(5);
    enqueue(queue,x);
    int *y =new int(10);
    enqueue(queue,y);
    int *getPtr{nullptr};

    queueFront(queue, (void *)&getPtr);
    std::cout << *getPtr << std::endl;
}

В книге, которую я сейчас использую, говорится, что при вызове queueFront используется «(void *) & getPtr», но компилятор выдает ошибку «неправильный вывод из void * в void **»}. Я знаю, что использование (void **) работает, но я хочу привести int * к void *, а затем использовать его адрес.

1 Ответ

3 голосов
/ 01 июля 2019

Ты не.int** и void** - это две разные вещи.

Вы должны создать void*, а затем использовать его адрес.Затем вы можете безопасно вернуть его обратно к int*, если знаете, что оно указывает на int.

int main(){
    QUEUE *queue = createQueue();
    int *x = new int(5);
    enqueue(queue,x);
    int *y =new int(10);
    enqueue(queue,y);
    void *getPtr{nullptr};

    queueFront(queue, &getPtr);
    std::cout << *(int*)getPtr << std::endl;
}

В идеале вы должны использовать книгу, которая не была написана в 1970 году, с использованием древних идиом языка Си;мы больше не используем void* указатели;мы используем шаблоны.

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