0

回答を検索してみましたが、残念ながら例が複雑すぎて理解できません。最も基本的には、ポインタの配列のアドレスを渡したり変更したりする方法を知りたいです。

例:

    class Foo {
      M** arryM;
      ...
      arryM = new M*[10];
      ...
      void Foo::replace(int ind, M &newm) {
        // Q1: which one correct to change the address of an element to a new object's address?
        arryM[ind] = newm; // this correct to pass and reset a new address for pointer?
        arryM[ind] = &newm; // or is this correct, or does this just set the object pointed by array element instead of the array element's address?
        *arryM[ind] = newm; // or do I need to dereference the pointer rep by array element first?
        &arryM[ind] = &newm; // or is this correct??
      }
      ...
      // Q2: is it easier to return a pointer or address for this function?
      M & Foo::getM(int ind) {
        M *out;
        // Q3: which one of following correct to get correct address value to return?
        out = arryM[ind]; // get address to M obj pointed by pointer array elem
        out = *arryM[ind]; // is "arryM[ind]" == "*ptr"?? if so how to get to "ptr"?
        out = &arryM[ind]; // is this way to get to "ptr" so addresses passed?
        return out;
      }
   }
   void main() {
     M *op1;
     M *op2;
     M *sol;
     Foo mstorage; // and assume already got valid M objects pointed to by arryM[] elements
     ...
     // Q4: which one correct?
     op1 = mstorage.getM(x); // x being the correct and valid int index pos
     op1 = *mstorage.getM(x); // so address and not object pointed to is passed?
     *op1 = mstorage.getM(x); 

     op2 = mstorage.getM(y);
     ... // perform some operations using op1 and op2 M functions
     int size = op1->getDim() + op2->getDim();
     sol = new M(size, name); // no default constructor--M objects need a size parameter
     ...// perform/set values of sol based upon op1, op2 values
     // Q5: this is correct to pass the address for sol object created, right?
     if (<sol already exists>) mstorage.replace(indx, *sol);
     else mstorage.add(*sol);
   }

したがって、コードサンプルから抽出した5つの主な質問を以下に示します。Q1、Q3、Q4は、私にとって最も重要で混乱を招きます。

Q1(重要):array[i]がポインター*nを返す場合、「array [i]」を「n」のように逆参照して、「*p」が外部で作成されたオブジェクトのアドレス。また、「* p」はtype&パラメータを使用した関数呼び出しを介して渡されます。

Q2:与えられたコンテキストでは、関数でポインターまたはアドレスを返す方が良いですか?または、コンテキストを変更して、一方の関数の戻り型をもう一方の関数よりも優先して機能させる方が簡単でしょうか。

Q3(重要):アドレスを返す場合、「array [i]」(Q1と同じ仮定に基づく)を「*」で表されるオブジェクトではなく「n」に含まれるアドレスにする正しい方法は何ですか。 n "?

Q4(重要):関数がアドレス&を返す場合、ローカルで作成されたポインター*pは"p = obj.funcretaddress()"によってアドレスを受け取ることができますか?ダブルスを含むサンプルコードを見たのですが、混乱しました:「doublehours = funcreturningaddress()」。

Q5:関数パラメーターが「obj&x」を取り、ローカルで「obj * y」を作成し、関数呼び出しで「function(* y)」を渡し、次に関数スコープ「obj * n =&x "であるため、array [i]で表されるポインターは、ローカルで作成されたobjの正しいアドレスを取得できます。

数日間コンパイルと調整を行っているので、Webからintおよびdoubleデータ型の例を取得して、作成されたクラスオブジェクトに適用しようとすると混乱します。

申し訳ありませんが、不明な点があればお知らせください。

編集:どうもありがとう、そしてQ4を明確にしたかっただけです:

    int a = 2;
    int *b;
    b = &a;
    *b = 3;
    int c = 4;
    b = func(c); // *b now points to c, and value is 5?
    *b = func(c); // *b value is updated to 5, and a therefore also now 5??
    ...
    int & func(int &d) {
      d++;
      return &d; // correct, or wrong as &&d is returned?
      return d; // and the & is applied to the var d?
    }
4

1 に答える 1

0

Q1。次の2つは正しいです。arrayM[ind]はポインタを返します。したがって、ポインタに格納していると考えてください。追加するオブジェクト(つまりnewM)の存続期間については注意してください

arryM[ind] = &newm; // or is this correct, or does this just set the object pointed by array element instead of the array element's address?
*arryM[ind] = newm;

Q2。以下は正しいです。

out = arryM[ind];

また、参照を期待している場合はポインタを返すことはできません。したがって、関数を送信側ポインターに変更するか、ポインターの代わりに値を送信することができます。

Q3。次のように住所を返す場合

return array[ind]

次に、ポインタを返します。(つまり、M * myArray)。次のように要素にアクセスできます

1. myArray[index]
2. *(myArray+1)

Q4。参照(つまりM&)を返す場合は、参照または通常のオブジェクトのいずれかにそれらを収集する必要があります。そうでない場合は、次のように値をポインターに格納することもできます。

Function: M& foo()
Call: M m = foo()
OR M& m = foo()
OR M* m;  *m = foo();

Q5。ここであなたの質問をすることができませんでした。後で更新します。

詳細な説明が必要な場合はお知らせください。

于 2012-12-05T02:44:45.223 に答える