• ベストアンサー

C言語の参照はずしについて

ソートのプログラムなんですが #include <stdio.h> #include <stdlib.h> int comp(const void *, const void *); int main() { int i; int test[6] = {10, 8, 2, 6, 4, 0}; qsort(test, (size_t)6, sizeof(int), comp); printf("\n"); for (i = 0; i < 6; i++) printf("%d\n", test[i]); return 0; } int comp(const void *a, const void *b) { static int i = 1; printf("%02d--%d,%d\n", i, *(int *)a, *(int *)b); i++; return (*(int *)a - *(int *)b); } 最後のreturnの()の中身がよくわかりません。「参照はずし」という事をしてるらしいんですが「参照はずし」とは何ですか意味も教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.2

>charからintにも出来るのですか? それは普通にキャストするだけでよいとおもいます。 char a = 1; int b = (int)a; #return (*(int *)a - *(int *)b); #どっかで見たことあると思ったのですが、 #「独習C」の関数ポインタの #説明にもでてきますね。

morumomo
質問者

お礼

ありがとうございました。 これからも宜しくお願いします。

その他の回答 (1)

  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

C言語と付き合って結構長いけれど、 「参照はずし」という言葉は聞いたことがありません。 やっていることはわかります。 要するに、 return (*a - *b); というような意味です。 ポインタaとbが参照している値のどちらが大きいか計算しています。 ただし、関数compの引数が、 int comp(const int *a, const int *b) なら都合が良かったのだけど、 int comp(const void *a, const void *b) だったので(qsort()の要請でそうなっているので)、 それと合わせるために、void *をint *に 直す必要があったわけです。 void *のままでは値として参照できません。

morumomo
質問者

お礼

分かりやすかったです。ありがとうございます。 void*をint*にするために*(int*)aにしていたのですね。 void*のものを他の型にするときだけ*(int*)aのように出来るのですか?charからintにも出来るのですか?

関連するQ&A

専門家に質問してみよう