1

Cコードを別の言語に翻訳しています。ポインタについて混乱しています。私がこのコードを持っているとしましょう。関数fooは、関数bobを呼び出し、これらは両方ともポインターです。

double
*foo(double *x, double *init, double *a){
   double *y = (double*)malloc(5*sizeof(double));
   double *z = (double*)malloc(5*sizeof(double));
   double *sum, *update;

   sum = (double*)bob(y, z)    //<---Q1: why y and z don't need stars in front of them? 
                               //I thought they are pointers?

   for (i<0; i<5; i++){
       z[i]=y[i]               //Q2: howcome it's ok to assign y to z? 
   }                           //aren't they pointer?(i.e.hold memory address)
}

double
*bob(*arg1, *arg2){
   something...
}

それで、
1)なぜyとzはそれらの前に星を必要としないのですか、yとzは単にアドレスするのではありませんか?
2)sumに星がないのはなぜか、sumはポインタとして宣言されていると思いました。
3)yをzに割り当ててもよいのはなぜですか?

私はこれらを学びました、しかしそれらはすっごく長いです、誰かが私にヒントを与えることができますか?

4

6 に答える 6

0
  1. 値yとzは、星を追加すると逆参照されるため、星は必要ありません。値ではなくポインターを渡します。
  2. 繰り返しますが、値ではなくポインタが必要です。コードからは実際に値が必要なように見えますが、おそらくそこに星があるはずです。
  3. ポインタを別のポインタに割り当てることができます。これは、ポインタが指すアドレスを変更することを意味します。したがってy=z、がポイントになると、yポイントがzポイントになります。
于 2012-11-20T22:28:15.467 に答える
0
  1. 逆参照しないため、スターは必要ありませんが、ポインターとして渡します。
  2. ポインタを比較することはできますが、それはおそらくあなたが望むものではありません。
  3. ただし、ポインタの割り当ては問題ありませんが、値のコピーと同じではないことに注意してください。
于 2012-11-20T22:28:22.763 に答える
0

Q1の回答:ポインタを引数として受け取る別の関数に渡しyzいますが、なぜポインタの値を渡すのですか?

Ans2:それらはポインタであり、あなたはお互いに割り当てています

于 2012-11-20T22:28:37.933 に答える
0

基本的なポインタの概念:

double a = 42.0;   // a is a double
double b;          // b is a double
double *x;         // x is a pointer to double

x = &a;  // x is the pointer, we store the address of a in pointer x
b = *x;  // *x is the pointee (a double), we store the value pointed by x in b

// now b value is 42.0
于 2012-11-20T22:36:00.937 に答える
0

2)と、z [i] = y [i]が受け入れられる理由については、配列とポインター、特に2.1から2.8について詳しく説明しているこのページを参照するのが最善だと思います。その特定の式で起こっていることは(必ずしも順番にではありません)、位置yで開始し、ポインターをフェッチし、ポインターにiを追加してから、その位置でポイントされた値をフェッチします。zから開始し、ポインターをフェッチし、ポインターにiを追加して、その場所に値(y [i])を割り当てます。

于 2012-11-20T22:39:45.897 に答える
0
double
*foo(double *x, double *init, double *a){
// x is a pointer to a double, init is a pointer to a double, a is a pointer to a double
// foo is a function returning a pointer to a double
//   and taking three pointers to doubles as arguments

   double *y = (double*)malloc(5*sizeof(double));
   // y is a pointer to a double. It is assigned a pointer returned by malloc.
   //   That pointer returned by malloc points to memory space for 5 doubles.

   double *z = (double*)malloc(5*sizeof(double));
   // z is a pointer to a double. It is assigned a pointer returned by malloc.
   //   That pointer returned by malloc points to memory space for 5 doubles.

   double *sum, *update;
   // sum and update are pointers to doubles    

   sum = (double*)bob(y, z)    //<---Q1: why y and z don't need stars in front of them? 
                               //I thought they are pointers?
   // sum (whose type is pointer to double) 
   //   is assigned a pointer to double returned by bob

   for (i<0; i<5; i++){
       y[i] = z[i]       //and are z and y pointers?!?!
       // y[i] === *(y+i)
       // (y + i) points to the i-th element in the space previously allocated by malloc
       // *(y + i) dereferences that pointer
       // equivalently, y[i] accesses the i-th element from an array
   }
   if(sum<0)
   z=y //Q2: howcome it's ok to assign y to z? 
       //aren't they pointer?(i.e.hold memory address)
   // after the assignment, z contains the same address as y (points to the same memory)
}

double
*bob(*arg1, *arg2){
   something...
}
于 2012-11-20T22:52:55.087 に答える