Latest web development tutorials

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;

ここでは、型が基本型へのポインタである、それは有効な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("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

C NULLポインタ

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

NULLポインタは、標準ライブラリゼロの定数で定義されています。 次のプログラムを考えてみましょう。

#include <stdio.h>

int main ()
{
   int  *ptr = NULL;

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

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

ptr 的值是 0

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

次のようにNULLポインタをチェックするために、あなたは、if文を使用することができます。

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

Cポインタは詳細

Cでは、非常に単純ですが、非常に重要であり、多くのポインタ関連する概念があります。 ポインタCプログラマに関連付けられているいくつかの重要な概念が明確でなければならない以下の通りです:

概念描述
指针的算术运算 可以对指针进行四种算术运算:++、--、+、-
指针数组 可以定义用来存储指针的数组。
指向指针的指针 C 允许指向指针的指针。
传递指针给函数 通过引用或地址传递参数,使传递的参数在调用函数中被改变。
从函数返回指针 C 允许函数返回指针到局部变量、静态变量和动态内存分配。