Cのポインタとは何ですか?
Cのポインタは、別の変数のアドレスを格納する変数です。ポインタを使用して、別のポインタ関数を参照することもできます。ポインタはインクリメント/デクリメントできます。つまり、次/前のメモリ位置を指すことができます。ポインタの目的は、メモリスペースを節約し、実行時間を短縮することです。
Cでポインタを使用する方法
int型の変数vを宣言すると、vは実際に値を格納します。
vはゼロになりました。
ただし、値以外の各変数にもアドレスがあります(または、簡単に言えば、メモリ内のどこにあるか)。アドレスは、変数名の前にアンパサンド(&)を付けることで取得できます。
変数のアドレスを画面に出力すると、次のように表示されます。完全に乱数のように(さらに、実行ごとに異なる場合があります)。
Cのポインターを使用して実際にこれを試してみましょう。例
このプログラムの出力は-480613588です。
さて、ポインタとは何ですか?値を格納する代わりに、ポインタは変数のアドレスを格納します。
ポインタ変数
Int * y = & v;
変数 |
POINTER |
名前付きストレージ/メモリアドレスに格納されている値 |
別の変数のストレージ/メモリアドレスを指す変数 |
ポインターの宣言
変数と同様に、Cプログラムのポインターmmingは、プログラムで使用する前に宣言する必要があります。ポインタは、Cの命名規則に従っている限り、任意の名前を付けることができます。ポインタ宣言の形式は次のとおりです。
data_type * pointer_variable_name;
ここでは
- data_typeは、Cの変数型のポインターの基本型であり、ポインターが指す変数の型を示します。
- アスタリスク(*:使用されるのと同じアスタリスク乗算の場合)、これは間接演算子であり、ポインタを宣言します。
このCポインタチュートリアルでいくつかの有効なポインタ宣言を見てみましょう。
ポインタを初期化します
ポインタを宣言した後、標準変数のように変数アドレスで初期化します。 Cプログラミングのポインターが初期化されておらず、プログラムで使用されていない場合、結果は予測できず、悲惨な結果になる可能性があります。
変数のアドレスを取得するには、アドレスが必要な変数の名前の前に配置されたアンパサンド(&)演算子を使用します。ポインタの初期化は、次の構文で行われます。
ポインタ構文
pointer = &variable;
ポインタを説明するための簡単なプログラムを以下に示します。
出力:
Address stored in a variable p is:60ff08Value stored in a variable p is:10
演算子 | 意味 |
* | 2つの目的を果たします
|
& | 1つの目的のみを提供
|
Cのポインタの種類
Cのさまざまなタイプのポインタは次のとおりです。
ヌルポインタ
ポインタ宣言中にnull値を割り当てることにより、nullポインタを作成できます。この方法は、ポインタにアドレスが割り当てられていない場合に役立ちます。ヌルポインタには常に値0が含まれます。
次のプログラムは、ヌルポインタの使用法を示しています。
#include <stdio.h>int main(){int *p = NULL; //null pointerprintf("The value inside variable p is:\n%x”,p);return 0;}
出力:
The value inside variable p is:0
ボイドポインタ
Cプログラミングでは、ボイドポインタは汎用ポインタとも呼ばれます。標準のデータ型はありません。 voidポインタは、キーワードvoidを使用して作成されます。任意の変数のアドレスを格納するために使用できます。
次のプログラムは、voidポインタの使用法を示しています。
#include <stdio.h>int main(){void *p = NULL; //void pointerprintf("The size of pointer is:%d\n",sizeof(p));return 0;}
出力:
The size of pointer is:4
ワイルドポインタ
ポインタが何にも初期化されていない場合、ポインタはワイルドポインタと呼ばれます。これらのタイプのCポインタは、未知のメモリ位置を指している可能性があり、プログラムで問題が発生したり、プログラムがクラッシュしたりする可能性があるため、効率的ではありません。ワイルドポインタを操作するときは、常に注意する必要があります。
次のプログラムは、ワイルドポインタの使用法を示しています。
#include <stdio.h>int main(){int *p; //wild pointerprintf("\n%d",*p);return 0;}
出力
timeout: the monitored command dumped coresh: line 1: 95298 Segmentation fault timeout 10s main
「c」内の他のタイプのポインターは次のとおりです。
- ぶら下がりポインター
- 複雑なポインター
- 近くのポインター
- 遠いポインター
- 巨大なポインター
直接および間接アクセスポインター
Cでは、2つの同等の方法があります変数コンテンツにアクセスして操作するには
- 直接アクセス:変数名を直接使用します
- 間接アクセス:変数へのポインターを使用します
以下のプログラムを使用してこれを理解しましょう
エラーなしでプログラムをコンパイルすると、結果は次のようになります。
Direct access, var = 1Indirect access, var = 1The address of var = 4202496The address of var = 4202496Indirect access, var = 48
Cのポインタ演算
ポインタ操作は次の図に要約されています
優先操作(優先順位)
Cポインターを使用する場合は、次の点に注意する必要があります。次の優先ルール:
PポインタがX変数を指している場合、* PはXが記述できる場所であればどこでも使用できます。
次の式は同等です。
後者の場合、括弧が必要です。単項演算子*と++は右から左に評価されるため、括弧なしでポインターP Pが指すオブジェクトではなく、インクリメントされます。
以下の表は、Cポインターを処理するときに使用できる算術演算と基本演算を示しています
操作 | 説明 |
割り当て | int * P1、* P2 P1 = P2; P1とP2は同じ整数変数を指します |
インクリメントとデクリメント | Int * P1; P1 ++; P1–; |
オフセットの追加(定数) | これにより、ポインターはテーブル内のN個の要素を移動できます。ポインタは、変数のタイプのバイト数のN倍だけ増減します。 P1 + 5; |
Cポインタ&例を含む配列
従来、インデックスを使用して配列要素にアクセスしますが、このメソッドはポインタを使用することで排除できます。ポインタを使用すると、各配列要素に簡単にアクセスできます。
出力
12345
特定の数値をポインターに加算すると、ポインターの位置が加算操作で取得した値に移動します。次の加算操作p + 1を実行すると、pが現在メモリ位置0を指しているポインタであるとすると、次のように実行されます。
pは現在1を追加した後、位置0を指しているため、値は1になり、ポインターはメモリ位置1を指します。
Cポインタと例を含む文字列
文字列はcharオブジェクトの配列であり、null文字「\ 0」で終わります。ポインタを使用して文字列を操作できます。 Cの例のこのポインタは、このセクションを説明しています
出力
First character is:HNext character is:ePrinting all the characters in a stringHelloGuru99!
文字列を処理する別の方法は、次のようなポインタの配列を使用することです。プログラム:
出力:
Please remember these materials:ironcoppergold
Cでのポインターの利点
- ポインターはアクセスに便利ですメモリの場所。
- ポインタは、配列構造の要素にアクセスするための効率的な方法を提供します。
- ポインタは、動的なメモリ割り当てと割り当て解除に使用されます。
- ポインタは、リンクリスト、グラフ、ツリーなどの複雑なデータ構造を形成するために使用されます。
Cのポインタの欠点
- ポインタは少し複雑です理解するために。
- ポインタは、セグメンテーション障害などのさまざまなエラーを引き起こしたり、まったく必要のないメモリ位置にアクセスしたりする可能性があります。
- ポインタに誤った値が指定された場合、メモリの破損を引き起こす可能性があります。
- ポインタもメモリリークの原因です。
- ポインターは変数よりも比較的遅いです。
- プログラマーは、ポインターの操作が非常に難しいと感じています。したがって、ポインタを注意深く操作するのはプログラマの責任です。
概要
- ポインタは、データが格納されるメモリの場所に他なりません。
- ポインタはメモリ位置にアクセスするために使用されます。
- nullポインタ、ワイルドポインタ、voidポインタ、その他の種類のポインタなど、さまざまな種類のポインタがあります。
- ポインタを配列および文字列とともに使用して、要素に効率的にアクセスできます。
- 関数ポインタを作成して関数を動的に呼び出すことができます。
- 算術演算は、ポインター算術と呼ばれるポインターで実行できます。
- ポインタは、ポインタの配列を定義する場合にさまざまな関数を簡単に呼び出すことができる関数を指すこともできます。
- さまざまな変数データ型を処理する場合は、次のことができます。 タイプキャストvoidポインタを使用します。