Я начинаю эксперимент C со связанными списками, и я нашел репозиторий Github для одного. функция создания записывается так:Использование функции с аргументом указателя void
Node* ListCreate(void* data) {
Node *head = malloc(sizeof(Node));
if (head != NULL) {
head->next = NULL;
head->data = data;
}
return head;
}
Я был в состоянии использовать его, изменяя void*
к int
, а затем в main
делать:
Node *root = ListCreate(5);
Но потом я прочитал немного о недействительных указателях и похоже, они могут использоваться в качестве типичных типов вроде подобных C++-шаблонов, что было бы полезно, если бы я мог понять, как они работают. Я попробовал несколько вещей, и ближе всего я должен не получать его работу без ошибок, но одно предупреждение:
incompatible integer to pointer conversion passing 'int' to parameter of type 'void *'
Я пропускаю шаг здесь? Сначала я почувствовал, что должен добавить что-то к определению функции, но я предполагаю, что человек, который написал его, знает, что он делает, и я просто не использовал его правильно в main
. Итак, есть ли другой способ передать аргумент этой функции?
Вы можете использовать указатели void, когда одна функция будет обрабатывать различные типы данных (и особенно когда имеет смысл передавать указатели на эти разные типы данных), но когда она будет обрабатывать один тип, вы обычно пытаетесь чтобы избежать этого. Обратите внимание, что такие функции, как 'qsort()' или 'bsearch()' пропускают указатели void вокруг, поэтому, если вы их используете, у вас будут функции, которые принимают указатели void, но преобразуют переданный указатель в правильный (ожидаемый) тип. Вы не можете преобразовать из целых типов в указатели без явного приведения; вы не можете конвертировать из типов с плавающей точкой вообще. –
Я пытался сделать так, чтобы данные связанного списка могли быть настроены на ints, floats или chars. Это гораздо сложнее сделать на C, чем на C++? – Austin
OK; Каков тип данных в списке? Вы сохраняете значения «int» или «int *»?Обработка 'int *' достаточно проста в коде списка, но сложнее в коде с использованием кода списка. У вас должна быть отдельная переменная 'int' для каждого указателя, чтобы указать, чтобы вы могли сохранить их в списке (и есть пространство теряется, потому что у вас есть указатель и значение, на которое он указывает). То же самое для 'float'. Когда вы говорите 'char', вы имеете в виду одиночные символы (жесткие) или строки (aka' char * ', относительно легко)? –