[解決済み] void*の意味と使い方を教えてください。
質問
今日、他の人のコードを読んでいたら、次のようなものがありました。
void *func(void* i);
これは何ですか?
void*
ここでは、関数名と変数型にそれぞれ意味があるのでしょうか?
また、このようなポインターは、どのような場合に、どのように使うのでしょうか。
どのように解決するのですか?
へのポインタ
void
は一般的なポインタ型です。 A
void *
は、明示的にキャストすることなく他の任意のポインタ型に変換することができます。 を参照解除することはできません。
void *
ポインタの演算を行うには、まずこれを完全なデータ型へのポインタに変換する必要があります。
void *
は、同じコード内で異なるポインタ型を扱えるようにする必要がある場合によく使われます。 よく例に出されるのが、ライブラリ関数の
qsort
:
void qsort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *));
base
は配列のアドレスです。
nmemb
は配列の要素数です。
size
は各要素のサイズ、そして
compar
は配列の 2 つの要素を比較する関数へのポインタです. このように呼び出される。
int iArr[10];
double dArr[30];
long lArr[50];
...
qsort(iArr, sizeof iArr/sizeof iArr[0], sizeof iArr[0], compareInt);
qsort(dArr, sizeof dArr/sizeof dArr[0], sizeof dArr[0], compareDouble);
qsort(lArr, sizeof lArr/sizeof lArr[0], sizeof lArr[0], compareLong);
配列の表現
iArr
,
dArr
および
lArr
は関数呼び出しの際に暗黙のうちに配列型からポインタ型に変換され、それぞれは"ポインタから
int
/
double
/
long
へのポインタ。
void
"です。
比較関数は次のようなものになる。
int compareInt(const void *lhs, const void *rhs)
{
const int *x = lhs; // convert void * to int * by assignment
const int *y = rhs;
if (*x > *y) return 1;
if (*x == *y) return 0;
return -1;
}
を受け入れることで
void *
,
qsort
は、あらゆる型の配列を扱うことができます。
を使うことのデメリットは
void *
は、型の安全性を窓から対向車線に投げ出すことになります。 間違った比較ルーチンの使用からあなたを守るものは何もないのです。
qsort(dArr, sizeof dArr/sizeof dArr[0], sizeof dArr[0], compareInt);
compareInt
は、その引数が以下の場所を指していることを期待しています。
int
を使用していますが、実際には
double
s. コンパイル時にこの問題を発見する方法はありません。
関連
-
[解決済み] C関数から文字列を返す
-
[解決済み] C - Setデータ構造を実装するには?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
-
[解決済み] C言語における「static」の意味とは?
-
[解決済み] ポインタの「デリファレンス」とはどういう意味ですか?
-
[解決済み] プログラム終了前にmallocの後にfreeをしないと本当に何が起こるのか?
-
[解決済み] フリーは、どのように無料化を知っているのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
解決済み] g++ コンパイルエラー: ')'トークンの前に一次式があることが予想される
-
[C] レポートエラー 代入の左オペランドとしてlvalueが必要
-
警告:代入がキャストなしで整数からポインタを作成する場合の修正方法に関する警告
-
initializer element is not constant "というエラーが表示されるのですが?
-
C/C++の再定義
-
C: 1を求める! + 2! + 3! + ... + n! (ループ)
-
[解決済み] C、C++、C#におけるvoidの意味とは?
-
[解決済み] 初期化でポインタ対象の型から修飾語を捨てる
-
[解決済み] C言語でchar配列をコピーする方法は?
-
[解決済み] c または c++ 用のシンプルな 2 次元クロスプラットフォームグラフィックスライブラリ?[クローズド]