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言語