私はCの初心者でリンクリストを試しています.Githubレポが見つかりました。作成関数は次のように書かれている:voidポインター引数を持つ関数を使用する
Node* ListCreate(void* data) {
Node *head = malloc(sizeof(Node));
if (head != NULL) {
head->next = NULL;
head->data = data;
}
return head;
}
私はint
にvoid*
を変更することにより、それを使用することができましたし、その後main
でやって:
Node *root = ListCreate(5);
をしかし、私は、ボイドポインタについて少し読み、 C++テンプレートのようなジェネリック型として使えるように思えますが、どのように動作するかを理解することができれば便利です。私はいくつかのことを試みたが、私は仕事にそれを得るために持っている最も近いエラーではありませんが、1つの警告:
incompatible integer to pointer conversion passing 'int' to parameter of type 'void *'
私はここでステップ足りませんか?私は最初に関数定義に何かを追加する必要があるように感じましたが、私はそれを書いた人が自分がやっていることを知っていて、ちょうどmain
で正しく使用しなかったと仮定しています。だから私はこの関数に引数を渡すはずの別の方法はありますか?
ひとつの関数が異なる型のデータを扱う場合(特にそれらの異なる型のデータにポインタを渡すのが合理的な場合)にvoidポインタを使用することがありますが、それを避けるために。 'qsort()'や 'bsearch()'のような関数はvoidポインタを渡すので、voidポインターを受け入れる関数を用意していますが、渡されたポインターを正しい(期待される)型に変換します。明示的なキャストなしで整数型からポインタに変換することはできません。浮動小数点型から変換することはできません。 –
私はリンクリストのデータをint、float、またはcharに設定できるようにしようとしていました。これはC++よりもC言語では難しいのですか? – Austin
OK;リストのデータ型は何ですか? 'int'値や' int *'値を格納していますか?'int *'の扱いはリストコードでは簡単ですが、リストコードを使用するコードでは難しくなります。ポインタをポイントするために別々の 'int'変数を持たなければならないので、リストに格納することができますポインタとそれが指している値の両方を持っているのでスペースが無駄になります)。 'float'のために同上。 'char'と言うと、単一の文字(ハード)や文字列(別名' char * '、比較的簡単)を意味しますか? –