3

この関数の定義を見つけました

void *func(void *param) {

}

実際、私はこの関数の定義に関して一定の混乱を持っています。void *は、関数の戻り型と引数で何を意味しますか。私はCの初心者ですので、気にしないでください。ありがとうございました

void *func(void *param) {
  int s = (int)param;
  ....
}

私が見つけた上記のプログラムをよく見てください。あるべきだったと思います

int *s = (int *)param;

ではない?私は混乱しています

4

5 に答える 5

5

void *これは特定のタイプのポインターではないことを意味します。intポインターとは異なり、ジェネリックポインターと考えてint *ください。

必要に応じて、別の型にキャストできます(たとえば、ポインターを使用してポインター演算を実行する場合)。

あなたはこのSOの使用の質問を見つけるかもしれません:Cプログラミングにおけるvoidポインタの概念

于 2012-09-01T03:07:06.923 に答える
2

これは単に、関数funcが(任意の)ポインターである1つのパラメーターを受け取り、(任意の)ポインターを返すことを意味します。を使用するvoid *と、コンパイラに「これはポインタですが、この時点では何へのポインタであるかは問題ではありません」と伝えています。

指しているデータを実際に使用したい場合は、他のタイプへのポインターにキャストする必要があります。たとえば、がを指している場合は、変数をint作成して次のように逆参照できます。int *

int *int_ptr = (int *)param;
// now (*int_ptr) is the value param is pointing to
于 2012-09-01T03:13:38.320 に答える
1

生のポインタと考えることができます。アドレスにすぎません。ポインタはアドレスの権利にすぎないので、ほとんどの最新システムでは32ビットまたは64ビットのいずれかで、すべて同じサイズである必要があります。場合、それらがすべて同じサイズである場合、なぜなどと言うのでしょうint *か。char *これは、ポイントしている型を解釈する方法が必要なためです。int *つまり、逆参照するときにそのアドレスに移動し、4バイトをintまたはとして解釈します。char *つまり、逆参照するとそのアドレスに移動してバイトを取得するため、逆参照するvoid *warning: dereferencing ‘void *’ pointer基本的には不可能になります。その影響をコンパイラに依存する場合は、算術演算を行うときにも同じことが当てはまります。

では、なぜわざわざそれらを使用するのでしょうか。私は個人的には好きではなく、一部のグループは特にそれらを好きではありません。基本的に、かなり一般的なサブルーチンを作成できます。良い例はmemset、メモリのブロックを特定のバイト値に設定することです。最初の引数はvoid *そうです。 tは、バイト単位で機能することに注意するか、char *それとも正当な注意を払うかについて不平を言います。配列の合計サイズを適切に計算する必要があります。int *

于 2012-09-01T03:52:29.143 に答える
0

任意のタイプのポインタを返します。任意のデータ型にすることができます。

于 2012-09-01T03:20:40.367 に答える
0
void *func(void *param) {

}

paramはvoidポインターであり、任意の参照型のポインターであることを意味します。voidポインタにはオブジェクト型がないため、大文字と小文字が区別されない限り、逆参照することはできません。

so void *param;
   int *s=(int*)param;

ここで、paramはポインター変数であるため、ポインター変数としてキャストする必要があります。そこで行ったようにint型にキャストする必要はありません。

例えば

int x;
 float r;
 void *p=&x;
 int main()
 {
   *(int *)p=2;
     p=&r;
   *(float*)p=1.1;
 }

この例では、pはvoidポインタです。現在、mainメソッドで、pをintポインターとしてキャストし、次にfloatポインターとしてキャストして、最初に整数、次にfloatを参照できるようにしました。

于 2012-09-01T04:01:58.760 に答える