工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> C言語

C ポインタ

C ポインタ

このチュートリアルでは、ポインターについて学びます。ポインターとは何か、それらをどのように使用するか、および例を使用してそれらを使用する際に直面する可能性のある一般的な間違い.

ポインタは、C および C++ プログラミングの強力な機能です。ポインターを学ぶ前に、C プログラミングのアドレスについて学びましょう。


C のアドレス

変数 var がある場合 あなたのプログラムでは、 &var メモリ内のアドレスが表示されます。

scanf() を使用している間、アドレスを何度も使用しました 関数。

scanf("%d", &var);

ここで、ユーザーが入力した値は var のアドレスに格納されます 変数。実際の例を見てみましょう。

#include <stdio.h>
int main()
{
  int var = 5;
  printf("var: %d\n", var);

  // Notice the use of & before var
  printf("address of var: %p", &var);  
  return 0;
}

出力

var: 5 
address of var: 2686778

注: 上記のコードを実行すると、おそらく別のアドレスが得られるでしょう。


C ポインター

ポインター (ポインター変数) は、値ではなくアドレスを格納するために使用される特別な変数です。

ポインタの構文

ポインタを宣言する方法は次のとおりです。

int* p;

ここで、ポインタ p を宣言しました int の タイプしてください。

これらの方法でポインターを宣言することもできます。

int *p1;
int * p2;

ポインターを宣言する別の例を見てみましょう。

int* p1, p2;

ここでは、ポインター p1 を宣言しています。 および通常の変数 p2 .


ポインタへのアドレスの割り当て

例を見てみましょう。

int* pc, c;
c = 5;
pc = &c;

ここでは、c に 5 が割り当てられます。 変数。そして、c のアドレス pc に割り当てられています ポインター。


ポインタが指すモノの値を取得

ポインターが指すものの値を取得するには、 * を使用します オペレーター。例:

int* pc, c;
c = 5;
pc = &c;
printf("%d", *pc);   // Output: 5

ここでは c のアドレス pc に割り当てられています ポインター。そのアドレスに格納されている値を取得するには、 *pc を使用しました .

注: 上記の例では、pc *pc ではなくポインタです . *pc = &c のようなことはできませんし、すべきではありません;

ちなみに、* 逆参照演算子と呼ばれます (ポインターを操作する場合)。ポインターを操作し、そのポインターに格納されている値を返します。


ポインタが指す値の変更

例を見てみましょう。

int* pc, c;
c = 5;
pc = &c;
c = 1;
printf("%d", c);    // Output: 1
printf("%d", *pc);  // Ouptut: 1

c のアドレスを割り当てました パソコンへ ポインター。

次に、c の値を変更しました pc から 1 に と c のアドレス 同じです、*pc

別の例を見てみましょう。

int* pc, c;
c = 5;
pc = &c;
*pc = 1;
printf("%d", *pc);  // Ouptut: 1
printf("%d", c);    // Output: 1

c のアドレスを割り当てました パソコンへ ポインター。

次に、*pc を変更しました *pc = 1; を使用して 1 に . パソコン以来 と c のアドレス 同じです、c は 1 になります。

もう 1 つ例を挙げましょう。

int* pc, c, d;
c = 5;
d = -15;

pc = &c; printf("%d", *pc); // Output: 5
pc = &d; printf("%d", *pc); // Ouptut: -15

最初は c のアドレス pc に割り当てられています pc = &c; を使用したポインター . c以来 5、*pc

次に、d のアドレス pc に割り当てられています pc = &d; を使用したポインター . 以来 -15、*pc -15 になります。


例:ポインタの働き

実際の例を見てみましょう。

#include <stdio.h>
int main()
{
   int* pc, c;
   
   c = 22;
   printf("Address of c: %p\n", &c);
   printf("Value of c: %d\n\n", c);  // 22
   
   pc = &c;
   printf("Address of pointer pc: %p\n", pc);
   printf("Content of pointer pc: %d\n\n", *pc); // 22
   
   c = 11;
   printf("Address of pointer pc: %p\n", pc);
   printf("Content of pointer pc: %d\n\n", *pc); // 11
   
   *pc = 2;
   printf("Address of c: %p\n", &c);
   printf("Value of c: %d\n\n", c); // 2
   return 0;
}

出力

Address of c: 2686784
Value of c: 22

Address of pointer pc: 2686784
Content of pointer pc: 22

Address of pointer pc: 2686784
Content of pointer pc: 11

Address of c: 2686784
Value of c: 2

プログラムの説明

<オール>
  • int* pc, c;

    ここで、ポインター pc および通常の変数 c 、タイプ int の両方 、 創造された。
    パソコン以来 と c 初期化されていない、ポインタ pc アドレスを指していないか、ランダムなアドレスを指しています。そして、変数 c アドレスはありますが、ランダムなガベージ値が含まれています。
  • c = 22;

    これにより、変数 c に 22 が代入されます .つまり、変数 c のメモリ位置に 22 が格納されます。 .
  • pc = &c;

    これにより、変数 c のアドレスが割り当てられます ポインター pc へ .
  • c = 11;

    これにより、変数 c に 11 が代入されます .
  • *pc = 2;

    これにより、ポインタ pc が指すメモリ位置の値が変更されます 2まで

  • ポインタを扱う際のよくある間違い

    ポインター pc が必要だとします。 c のアドレスを指す .次に、

    int c, *pc;
    
    // pc is address but c is not
    pc = c;  // Error
    
    // &c is address but *pc is not
    *pc = &c;  // Error
    
    // both &c and pc are addresses
    pc = &c;  // Not an error
    
    // both c and *pc values 
    *pc = c;  // Not an error

    以下は、初心者がよく混乱するポインター構文の例です。

    #include <stdio.h>
    int main() {
       int c = 5;
       int *p = &c;
    
       printf("%d", *p);  // 5
       return 0; 
    }

    int *p = &c; を使用したときにエラーが発生しなかったのはなぜですか ?

    int *p = &c;

    と同等です

    int *p:
    p = &c;

    どちらの場合も、ポインター p を作成しています。 (*p ではありません) ) と &c を割り当てる

    この混乱を避けるために、次のようなステートメントを使用できます。

    int* p = &c;

    ポインターが何であるかがわかったので、次のチュートリアルでポインターが配列にどのように関連しているかを学習します。


    C言語

    1. C# Hello World - 初めての C# プログラム
    2. C# のキーワードと識別子
    3. C# 変数と (プリミティブ) データ型
    4. C# 演算子
    5. C# のビット単位およびビット シフト演算子
    6. C# の基本的な入力と出力
    7. C# 式、ステートメント、およびブロック (例付き)
    8. C# コメント
    9. C ポインタ
    10. 配列とポインタの関係
    11. C パスのアドレスとポインター