C言語ポインタ完全マスター:実践的ステップで上級プログラミングへ
ポインタとは
C言語のポインタは学びやすく、楽しいものです。一部のCプログラミングタスクはポインタを使うとより簡単に実行でき、動的メモリ割り当てなどのタスクはポインタなしでは実行できません。完璧なCプログラマになるにはポインタを学ぶ必要があります。シンプルで簡単なステップで学び始めましょう。
ご存知の通り、すべての変数はメモリ位置であり、すべてのメモリ位置にはアドレスが定義されており、アンパサンド(&)演算子を使ってアクセスできます。これはメモリ内のアドレスを表します。以下の例は定義された変数のアドレスを出力します:
Live Demo#include <stdio.h>
int main() {
int var1;
char var2[10];
printf("Address of var1 variable: %x\n", &var1);
printf("Address of var2 variable: %x\n", &var2);
return 0;
}
実行結果:
Address of var1 variable: bff5a400 Address of var2 variable: bff5a3f6
ポインタとは何か
ポインタとは、別の変数のアドレスを値とする変数、つまりメモリ位置の直接アドレスです。他の変数や定数と同様に、ポインタを使用して変数アドレスを格納する前に宣言する必要があります。ポインタ変数宣言の一般形式:
type *var-name;
ここで、typeはポインタの基本型で、有効なCデータ型でなければならず、var-nameはポインタ変数の名前です。ポインタ宣言に使用されるアスタリスク*は乗算に使用される同じアスタリスクですが、この文では変数をポインタとして指定するために使用されます。有効なポインタ宣言の例:
int *ip; /* 整数へのポインタ */ double *dp; /* doubleへのポインタ */ float *fp; /* floatへのポインタ */ char *ch; /* 文字へのポインタ */
すべてのポインタの値の実際のデータ型は、整数、浮動小数点、文字などに関わらず同じで、メモリアドレスを表す長い16進数です。異なるデータ型のポインタ間の唯一の違いは、ポインタが指す変数または定数のデータ型です。
ポインタの使い方
ポインタを使って頻繁に行う重要な操作がいくつかあります。(a)ポインタ変数を定義し、(b)変数のアドレスをポインタに割り当て、(c)ポインタ変数にあるアドレスの値にアクセスします。これは、オペランドで指定されたアドレスにある変数の値を返す単項演算子*を使用して行います。以下の例はこれらの操作を使用します:
Live Demo#include <stdio.h>
int main() {
int var = 20; /* 実際の変数宣言 */
int *ip; /* ポインタ変数宣言 */
ip = &var; /* varのアドレスをポインタ変数に格納 */
printf("Address of var variable: %x\n", &var);
printf("Address stored in ip variable: %x\n", ip);
printf("Value of *ip variable: %d\n", *ip);
return 0;
}
実行結果:
Address of var variable: bffd8b3c Address stored in ip variable: bffd8b3c Value of *ip variable: 20
NULLポインタ
正確なアドレスを割り当てる必要がない場合、ポインタ変数にNULL値を割り当てるのは常に良い習慣です。これは変数宣言時に行います。NULLが割り当てられたポインタをヌルポインタと呼びます。
NULLポインタは複数の標準ライブラリで定義された値0の定数です。以下のプログラムを考えてみましょう:
Live Demo#include <stdio.h>
int main() {
int *ptr = NULL;
printf("The value of ptr is : %x\n", ptr);
return 0;
}
実行結果:
The value of ptr is 0
ほとんどのOSでは、アドレス0のメモリへのアクセスは許可されていません。これはOSによって予約されているためです。しかし、メモリアドレス0には特別な意味があり、ポインタがアクセス可能なメモリ位置を指す意図がないことを示します。慣習的に、ポインタがヌル(ゼロ)値を含む場合、何も指していないと見なされます。
ヌルポインタをチェックするには、以下のように'if'文を使用します:
if(ptr) /* pがヌルでなければ成功 */ if(!ptr) /* pがヌルなら成功 */
ポインタの詳細
ポインタには多くの概念がありますが簡単で、Cプログラミングにとって非常に重要です。すべてのCプログラマが理解すべき重要なポインタ概念:
| 番号 | 概念と説明 |
|---|---|
| 1 | ポインタ演算 ポインタで使用できる4つの算術演算子:++、--、+、- |
| 2 | ポインタの配列 複数のポインタを保持する配列を定義できます。 |
| 3 | ポインタへのポインタ Cではポインタのポインタを持てます。 |
| 4 | 関数へのポインタ渡し 参照渡しまたはアドレス渡しにより、呼び出し側の引数を呼ばれた関数で変更可能にします。 |
| 5 | 関数からのポインタ返却 Cでは関数からローカル変数、静的変数、動的に割り当てられたメモリへのポインタを返せます。 |
C言語