[C ++学習日記] -07-ポインタ

ポインタ

各変数は、メモリロケーションを有し、各メモリ位置アドレスがハイフン( - )演算子のアクセスを使用して定義され、それはメモリ内のアドレスを表します。

次の例を考えてみます。

int score = 5;
cout << &score << endl;

//输出 "0x29fee8"

これは、出力変数の定義に対処します。


ポインタとは何ですか

ポインタは、その値が別の変数のアドレスを、メモリ位置の、すなわち、直接アドレスで可変です。

すべてのポインタ実際のデータ型の値は、整数、浮動小数点、文字列、または他のデータ型が同じであるかどうかを、代表の長い進メモリアドレスです。

注:異なる定数又は可変データ型へのデータポインタ、ポインタは、異なるタイプの唯一の違い。
ポインタは変数であり、単に他の変数または定数と同じように、あなたは他の変数のポインタストレージを使用する前に対処しなければならない、と宣言すること。


ポインタの宣言

アスタリスク*はポインタを宣言するために使用され、アスタリスクは同じ乗算に使用されています。しかし、この声明の中で、アスタリスクはポインタである変数を指定するために使用されます。

以下は、有効なポインタの宣言です:

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

変数と同様に、我々は名前と、このタイプの定義へのポインタへのポインタを与えます。

注:データ型や変数名の横にアスタリスクを配置することができ、また、中央に配置することができます。


使用ポインタ

ここでは、変数のアドレスポインタを割り当てます。

int score = 5;
int *scorePtr;
scorePtr = &score;

cout << scorePtr << endl;

//输出 "0x29fee8"

上記のコードは、割り当てメモリ位置スコア変数のシンボル&(アドレス)演算子を使用して、scorePtr整数ポインタへのポインタを宣言する。

さて、値がスコアscorePtrのメモリ・ロケーションです。


ポインタ演算子

C ++では、2つの事業者のポインタがあります。

アドレス演算子(&):オペランドのメモリアドレスを返します。

演算子を逆参照(*):操作変数値の数は、アドレスで指定される戻り。

次に例を示します。

int var = 30;
int *p;
p = &var;

cout << var << endl;
// 输出 30 (var的值)

cout << p << endl;
// 输出 0x28ff18 (var的内存位置)

cout << *p << endl;
/* 输出 30 (变量的值存储在指针p中) */

注:アスタリスク(*)は、ポインタを宣言するために使用され、ポインタは、それ(アスタリスクは、その複合指定子型部分である)ことを示すために使用される単純なオブジェクトの。指定されたアドレスの値が間接参照演算子の混乱に使用され得ることはありませんしてください。彼らは、同じ記号で表さちょうど2つの異なるものです。


動的メモリ

C ++での動的メモリは、それがどのように動作するかであることを理解することは資格のC ++プログラマが不可欠になることです。

C ++プログラムメモリは2つの部分に分かれています。

スタック:関数の内部で宣言されているすべての変数はスタックメモリを占有します。
ヒープ:これはプログラムメモリで使用されていない、プログラムの実行は、メモリを動的に割り当てるために使用することができます。
C ++では、実行時にヒープにメモリを割り当てるために、変数の特定のタイプにnew演算子を使用することができ、それが割り当てられた領域のアドレスを返します。

ここで任意の動的に割り当てられたデータ型の一般的な構文にnew演算子は以下のとおりです。

new data-type;

ここで、データ型は、任意の組み込みことができる配列を含むデータ型、ユーザ定義を含むデータ構造またはクラス含む任意の種類であってもよいです。

次に例を示します。

new int;

この割り当てられたメモリのサイズは、ヒープ内の整数を格納するために必要な、アドレスを返します。


ダイナミックメモリアクセス

C ++では、アドレスの割り当ては、その後、溶液がアクセス変数につながる可能性が、ポインタに格納されてもよいです。

次に例を示します。

int *p = new int;
*p = 10;

我々は整数動的メモリを割り当て、及び10を割り当てています。

ポインタPスタックに格納されたローカル変数、ヒープなどと割り当てアドレスにその値を保存します。スタックに格納された10のアドレス値。


リリースメモリ

ローカル変数のスタックの場合、メモリ管理が自動的に行われます。

いつでも、あなたが感じたときに、変数が動的にメモリが不要になった割り当てられていないことを、あなたはそれが使用するメモリを解放するには、delete演算子を使用することができます。次のとおりです。

delete pvalue;        // 释放 pvalue 所指向的内存

次に例を示します。

int *p = new int; // 为变量请求内存
*p = 10; // 在分配的地址存储值

cout << *p << endl; 

delete p; // 释放内存

ヒント:プログラムが閉じられるまでメモリ遺骨が割り当てられたのでメモリは、メモリリークが発生する新しいキーワードを使用して割り当て自由忘れてください。


ダングリングポインタ

C ++では、delete演算子は、変数に割り当てられたメモリを解放するが、ポインタがスタックに格納されているので、ポインタ自体を削除しません。

メモリ位置のポインタへのポイントは、ダングリングポインタと呼ばれる存在しません。

次に例を示します。

int *p = new int; // 请求内存
*p = 10; // 存储值

delete p; // 释放内存
// 现在p是一个悬空指针

p = new int; // 重新使用一个新的地址

ヒント:

中(iostreamを含む)いくつかの標準ライブラリで定義されているゼロ定数のNULLポインタ値があります。

あなたはそれを宣言すると、NULLポインタ変数に代入されますが、正確なアドレスの割り当てを持っていない場合には、良い習慣です。NULLポインタはNULLポインタと呼ばれて割り当てられます。例:int型* PTR =
NULL;


ダイナミックメモリは、アレイに割り当てられました。

次に例を示します。

	int *p = NULL; // 指针初始化为null
	p = new int[30]; // 请求内存
	p[0] = 1; //对数组下标为0的进行赋值
	cout << p[0];//输出
	delete [] p; // 删除由p指向的数组

動的なメモリ割り当ては、このようなプログラムは、入力に依存する場合など、多くの状況において有用です。アプリケーションは、画像ファイルを読むために必要がある場合たとえば、それは事前に所望の画像ファイルのサイズと記憶メモリを知りません。

オブジェクトの配列を削除して解放されたときは、「] [」記号を失わないように注意してください


小演習

1.宣言ポインタ「ptrが」int型、およびアドレス割り当てvarの値であります

2.書二つの変数aとbのaとb、PA及びPB二つのポインタポイント。その後、変数はPAとPBを介して出力に割り当てられています


推奨読書C / C ++ポインタ詳細

前の[C ++学習日記] -06-配列

公開された12元の記事 ウォン称賛12 ビュー5408

おすすめ

転載: blog.csdn.net/qq_18604209/article/details/103991207