-3

私は最近、ポインターに関する非常に高く評価されている優れた記事を見直していました。 読み進めるうちに、ポインタとは何かが理解できるようになりました。残念ながら、私はまだそれらを使用することができません。

理由は次のとおりです。ネーミングがわかりません。または、実際にはポインターのアプリケーションです。いくつかの「学びたい」本や記事を読んだ後、「ポインターを作成してインスタンス化する方法」という同様のコードに何度も遭遇しました。

答えるときは、サンプルコードを使用して、実際にポインターが出力するものを示してください。

コードは次のとおりです。

char ch = 'c'; 
char *chptr = &ch;

または、おそらくもっと紛らわしい:

char ch = 'c';
char *chptr;
chptr = &ch;

chptrは、 という名前の他の 2 つの変数とは異なる名前であることに注意してくださいch。3 つの変数すべてに名前を付けてみませんchか? ポインターに別の名前を付けると、どのような問題が解決しますか?

また、コードの最初のブロックには...*chptr = &ch;;があります。2番目に、chptr = &ch;. 2 番目のブロックでアスタリスクを削除してもよい理由は何ですか?

次に、ポインターのアプリケーションは何ですか。ポインターは常に必要ですか (ポインターが必要な場合と不要な場合)? 回答を送信した後、私は自信を持っています。ポインターを使用するより複雑なコードを理解できると信じており、言語を直感的に適応させ続けるのに十分です。まだまだ好奇心旺盛ですが。

たとえば、次のコード ブロックを使用します。

typdef struct person
{
  char *name;
  int age;
}

存在しない名前変数へのポインターとして名前を宣言する理由と、ポインターを使用せずに年齢変数を int として宣言する理由は何ですか? このブロックのために、それは意味がありません:

int main()
{
/* below, the int is a pointer */
  int *p;
  void *up;
  return 0;
}

またはこのブロック:

char *sp;
sp = "Hello";
printf("%s",sp);

ポインターはアドレスを指していると思いました。「こんにちは」は住所ではありません。

前の 2 つのブロックを念頭に置いて、この最後のブロックを見てください。

int main()
{
  int i,j;
  int *p;
  i = 5;
  p = &i;
  j = *p; //j = i?
  &p = 7; //i = 7?
}

j を &i に設定し*p = &iないでiください。また&p = 7、p のアドレスを 7 に設定すべきではありませんが、これは i ではない可能性があります。

4

2 に答える 2

2

chptr の名前は、ch という名前の他の 2 つの変数とは異なります (この時点で回答を追加しました)。3 つの変数すべてに ch という名前を付けてみませんか?

  • 変数がポインターであることをコード リーダーに明確に示すために、ポインターの前に 'p' を付ける (この場合は 'ptr' を付ける) のが一般的です。ご存じのように、ポインターを使用したプログラミングは最初は困難であり、int *i = 1;int i = 1はどちらも有効ですが、意図せず一方を他方に置き換えてしまうと、深刻なデバッグ時間が発生する可能性があります。

また、コードの最初のブロックには ...*chptr = &ch;; があります。2 番目は、chptr = &ch; です。2 番目のブロックでアスタリスクを削除してもよい理由は何ですか?

  • 「*」を使用してポインター変数を宣言する構文です。例:int *pInt;
  • ポインター変数に値を代入する (何かを指すようにする) 場合、「*」は必要ありません。元:

        int *pInt;
        pInt = &someInt;
    
  • ただし、ポインター変数が指すアドレスに値を割り当てるか、変数が指すアドレスの値を取得するには、「*」を使用して逆参照する必要があります。

        int *pInt;
        int someInt = 100;
        pInt = &someInt;
        *pInt = 50;
        printf("%d - %d", *pInt, someInt); // prints "50 - 50"
    

次に、ポインターのアプリケーションは何ですか。

  • ポインターは、とりわけ次の目的で使用されます。

    1. 関数への値渡し
    2. 動的メモリ割り当て ...

なぜ、name存在しない名前変数へのポインターとして宣言し、ポインターをage使用せずに変数を int として宣言するのですか?

  • 「こんにちは」は5文字の配列です。を使用するsp = "Hello"と、「Hello」がメモリ ロケーションに格納され、そのアドレスが に割り当てられspます。
  • あなたの例から、名前には任意の数の文字が含まれている可能性があると想定しているため、プログラムの実行中に名前を保存するために動的割り当てが使用されます。

ポインターはアドレスを指していると思いました。「こんにちは」は住所ではありません。

  • 「こんにちは」(C の文字列) は、文字の配列として扱われます。この場合、sp は 5 文字の配列を含むメモリ位置 (ヒープまたはスタック) を指し、代入で使用すると、メモリ内の "Hello" 文字列のアドレスが返されます。

    int main()
    {
      int i,j;
      int *p;
      i = 5;
      p = &i;
      j = *p; //j = i?
      &p = 7; //i = 7?
    }
    
    • j変更しても( still has value )の値に影響を与えないiという意味で、そうではありません。j=100ii5

    • &p = 7おそらくあなたが意図したものではありません。値を生成するため、おそらくエラーが発生し&p、値に値を代入することは違法です (例: 次のように評価されます: 0x0108 = 7;)

    • 上記の変数の次のメモリ サンプルを検討してください。

       address | var    | value
       0x0100  | i      | undefined
       0x0104  | j      | undefined
       0x0108  | p      | undefined
      
    • j = *p,

       0x0100 | i      | 5
       0x0104 | j      | 5
       0x0108 | p      | 0x0100
      

*p=7( から訂正&p = 7;)

         0x0100 | i      | 7
         0x0104 | j      | 5
         0x0108 | p      | 0x0100
于 2012-12-07T06:31:40.660 に答える