Cポインタ


C 言語でポインタを学ぶのは簡単で楽しいです。ポインタを使用すると、一部の C プログラミング タスクの実行が簡素化されます。また、動的メモリ割り当てなどの一部のタスクは、ポインタなしでは実行できません。したがって、優れた C プログラマになりたい場合は、ポインタを学ぶ必要があります。

ご存知のとおり、すべての変数にはメモリ位置があり、各メモリ位置はメモリ内のアドレスを表すハイフン (&) 演算子を使用してアクセスできるアドレスを定義します。次の例を参照してください。定義された変数アドレスが出力されます:

#include <stdio.h>int main (){   int  var1;   char var2[10];

   printf("var1 变量的地址: %x\n", &var1  );
   printf("var2 变量的地址: %x\n", &var2  );   return 0;}

上記のコードをコンパイルして実行すると、次の結果が生成されます:

var1 变量的地址: bff5a400
var2 变量的地址: bff5a3f6

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

ポインタとは何ですか?

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

type *var-name;

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

int    *ip;    /* 一个整型的指针 */double *dp;    /* 一个 double 型的指针 */float  *fp;    /* 一个浮点型的指针 */char   *ch     /* 一个字符型的指针 */

すべてのポインタ値の実際のデータ型は、整数、浮動小数点、文字、その他のデータ型であっても同じであり、16 進数のメモリ アドレスを表す long 値です。番号。異なるデータ型のポインター間の唯一の違いは、ポインターが指す変数または定数のデータ型です。

ポインターの使い方?

ポインターを使用する場合、ポインター変数の定義、ポインターへの変数アドレスの割り当て、ポインター変数で使用可能なアドレスの値へのアクセスという操作が頻繁に実行されます。これらは、単項演算子 * を使用して、オペランドで指定されたアドレスにある変数の値を返すことによって行われます。次の例には、次の操作が含まれます:

#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: bffd8b3cAddress stored in ip variable: bffd8b3cValue of *ip variable: 20

C の NULL ポインター

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

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

#include <stdio.h>int main (){   int  *ptr = NULL;

   printf("ptr 的值是 %x\n", ptr  ); 
   return 0;}

上記のコードをコンパイルして実行すると、次の結果が生成されます:

ptr 的值是 0

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

null ポインターをチェックするには、以下に示すように if ステートメントを使用できます:

if(ptr)     /* 如果 p 非空,则完成 */if(!ptr)    /* 如果 p 为空,则完成 */

C ポインターの詳細な説明

C には、ポインター関連の概念が多数あり、これらの概念は単純ですが、すべて重要です。以下に、C プログラマーが知っておく必要があるポインター関連の重要な概念をいくつか示します。

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