C ポインタ

C 言語のポインタを学ぶのは簡単で、しかも面白いです。ポインタを使用することで、いくつかの C プログラミングタスクの実行を簡素化できます。また、動的メモリ割り当てなど、ポインタなしでは実行できないタスクもあります。したがって、優れた C プログラマーになるためには、ポインタを学ぶことが非常に必要です。

ご存知のように、すべての変数にはメモリ位置があり、それぞれのメモリ位置は、使用可能な&演算子でアクセスされるアドレスを定義しており、メモリ内のアドレスを表します。

次の例を見てください。定義した変数のアドレスを出力します。

例

#include <stdio.h> int main () { int var_サンプル = 10; int *p; // ポインタ変数の定義 p = &var_サンプル; printf("var_サンプル 変数のアドレス: %p\n", p); return 0; }

上記のコードがコンパイルおよび実行されると、次の結果が生成されます。

var_サンプル 变量的地址: 0x7ffeeaae08d8

上記の例を通じて、メモリアドレスとは何か、そしてそれにアクセスする方法を理解しました。次に、ポインタとは何かを見てみましょう。

ポインタとは?

ポインタとはメモリアドレスのことであり、ポインタ変数はメモリアドレスを格納するための変数です。他の変数や定数と同様に、ポインタを使用して他の変数のアドレスを格納する前に、ポインタを宣言する必要があります。ポインタ変数の宣言の一般的な形式は次のとおりです。

type *var_name;

ここで、typeはポインタの基本型であり、有効な C データ型でなければなりません。var_nameはポインタ変数の名前です。ポインタを宣言するために使用するアスタリスク*は乗算で使用するアスタリスクと同じです。ただし、このステートメントでは、アスタリスクは変数がポインタであることを指定するために使用されます。以下は有効なポインタ宣言です。

int *ip; /*整数型のポインタ*/ double *dp; /*double 型のポインタ*/ float *fp; /*浮動小数点型のポインタ*/ char *ch; /*文字型のポインタ*/

すべての実際のデータ型(整数型、浮動小数点型、文字型、その他のデータ型)に対応するポインタの値の型は同じで、メモリアドレスを表す長い 16 進数です。

異なるデータ型のポインタ間の唯一の違いは、ポインタが指す変数または定数のデータ型が異なることです。

ポインタの使い方?

ポインタを使用する際には、以下の操作が頻繁に行われます。ポインタ変数の定義、変数のアドレスのポインタへの代入、ポインタ変数内の使用可能なアドレスの値へのアクセス。これらは単項演算子*を使用して、オペランドで指定されたアドレスにある変数の値を返します。次の例はこれらの操作に関するものです。

例

#include <stdio.h> int main () { int var = 20; /*実際の変数の宣言*/ int *ip; /*ポインタ変数の宣言*/ ip = &var; /*ポインタ変数に var のアドレスを格納する*/ printf("var 変数のアドレス: %p\n", &var ); /*ポインタ変数に格納されたアドレス*/ printf("ip 変数に格納されたアドレス: %p\n", ip ); /*ポインタを使用して値にアクセスする*/ printf("*ip 変数の値: %d\n", *ip ); return 0; }

上記のコードがコンパイルおよび実行されると、次の結果が生成されます。

var 变量的地址: 0x7ffeeef168d8
ip 变量存储的地址: 0x7ffeeef168d8
*ip 变量的值: 20

C における NULL ポインタ

変数を宣言するとき、割り当てる正確なアドレスがない場合は、ポインタ変数に NULL 値を代入するのは良いプログラミング習慣です。NULL 値を代入されたポインタは空NULL ポインタと呼ばれます。

NULL ポインタは、標準ライブラリで定義されている値がゼロの定数です。次のプログラムを見てください。

例

#include <stdio.h> int main () { int *ptr = NULL; printf("ptr のアドレスは %p\n", ptr ); return 0; }

上記のコードがコンパイルおよび実行されると、次の結果が生成されます。

ptr 的地址是 0x0

ほとんどのオペレーティングシステムでは、プログラムはアドレス 0 のメモリにアクセスできません。そのメモリはオペレーティングシステムによって予約されているためです。しかし、メモリアドレス 0 には特別な意味があり、そのポインタがアクセス可能なメモリ位置を指していないことを示します。慣例として、ポインタが null 値(ゼロ値)を含む場合、そのポインタは何も指していないと見なされます。

空のポインタを確認する必要がある場合は、次のように if 文を使用できます。

if(ptr) /*p が空でない場合、実行する*/ if(!ptr) /*p が空の場合、実行する*/

C ポインタの詳細

C にはポインタに関連する多くの概念があります。これらの概念はどれも簡単ですが、どれも重要です。以下に、C プログラマーが理解しておく必要があるポインタに関連する重要な概念をリストします。

概念説明
ポインタの算術演算ポインタに対しては、++、--、+、- の 4 つの算術演算を実行できます。
ポインタの配列ポインタを格納するための配列を定義できます。
ポインタへのポインタC では、ポインタへのポインタが許可されています。
関数へのポインタの受け渡し参照またはアドレスによって引数を渡すことで、渡された引数を呼び出し元の関数内で変更できます。
関数からポインタを返すC では、関数がローカル変数、静的変数、および動的に割り当てられたメモリへのポインタを返すことができます。
その他の拡張