C のポインター:C プログラミングのポインターとは何ですか?種類
C のポインタとは?
ポインタ Cでは、別の変数のアドレスを格納する変数です。ポインターを使用して、別のポインター関数を参照することもできます。ポインタはインクリメント/デクリメントできます。つまり、次/前のメモリ位置を指すことができます。ポインターの目的は、メモリ空間を節約し、実行時間を短縮することです。
C でポインターを使用する方法
int 型の変数 v を宣言すると、v は実際に値を格納します。
v は現在ゼロです。
ただし、値とは別に、各変数にはアドレス (または、簡単に言えば、メモリ内の場所) もあります。アドレスは、変数名の前にアンパサンド (&) を付けることで取得できます。
変数のアドレスを画面に表示すると、完全に乱数のように見えます (さらに、実行ごとに異なる可能性があります)。
Cの例でポインターを使って実際にこれを試してみましょう
このプログラムの出力は -480613588 です。
さて、ポインターとは何でしょう?値を格納する代わりに、ポインターは変数のアドレスを格納します。
ポインタ変数
Int *y =&v;
VARIABLEPOINTERA 値 名前付きに保存 ストレージ/メモリ アドレス 変数 指す 別ののストレージ/メモリ アドレス variableポインタの宣言
変数と同様に、C プログラミングのポインターは、プログラムで使用する前に宣言する必要があります。ポインターは、C の命名規則に従う限り、任意の名前を付けることができます。ポインター宣言の形式は次のとおりです。
data_type * pointer_variable_name;
ここで、
- データの種類 C の変数型のポインターの基本型であり、ポインターが指す変数の型を示します。
- 間接演算子であるアスタリスク (*:乗算に使用されるアスタリスクと同じ) は、ポインターを宣言します。
この C ポインター チュートリアルで有効なポインター宣言をいくつか見てみましょう:
int *ptr_thing; /* pointer to an integer */ int *ptr1,thing;/* ptr1 is a pointer to type integer and thing is an integer variable */ double *ptr2; /* pointer to a double */ float *ptr3; /* pointer to a float */ char *ch1 ; /* pointer to a character */ float *ptr, variable;/*ptr is a pointer to type float and variable is an ordinary float variable */
ポインタを初期化する
ポインタを宣言した後、変数アドレスを持つ標準変数のように初期化します。 C プログラミングのポインターが初期化されておらず、プログラムで使用されていない場合、結果は予測できず、悲惨な結果になる可能性があります。
変数のアドレスを取得するには、アドレスが必要な変数の名前の前にアンパサンド (&) 演算子を配置します。ポインターの初期化は、次の構文で行われます。
ポインタの構文
pointer = &variable;
ポインターを説明するための簡単なプログラムを以下に示します:
#include <stdio.h> int main() { int a=10; //variable declaration int *p; //pointer variable declaration p=&a; //store address of variable a in pointer p printf("Address stored in a variable p is:%x\n",p); //accessing the address printf("Value stored in a variable p is:%d\n",*p); //accessing the value return 0; }
出力:
Address stored in a variable p is:60ff08 Value stored in a variable p is:10オペレーター 意味 *2つの目的を果たします
<オール>
- 変数のアドレスを返します
C のポインターの種類
以下は、C のポインタの種類です。 :
ヌル ポインター
ポインター宣言中に null 値を割り当てることで、null ポインターを作成できます。このメソッドは、ポインタにアドレスが割り当てられていない場合に役立ちます。 null ポインターには常に値 0 が含まれます。
次のプログラムは、ヌル ポインターの使用法を示しています:
#include <stdio.h> int main() { int *p = NULL; //null pointer printf(“The value inside variable p is:\n%x”,p); return 0; }
出力:
The value inside variable p is: 0
ボイド ポインター
C プログラミングでは、void ポインターはジェネリック ポインターとも呼ばれます。標準のデータ型はありません。 void ポインターは、キーワード void を使用して作成されます。任意の変数のアドレスを格納するために使用できます。
次のプログラムは、void ポインターの使用法を示しています:
#include <stdio.h> int main() { void *p = NULL; //void pointer printf("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 pointer printf("\n%d",*p); return 0; }
出力:
timeout: the monitored command dumped core sh: line 1: 95298 Segmentation fault timeout 10s main
「c」の他のタイプのポインターは次のとおりです。
- ダングリング ポインター
- 複雑なポインター
- ニアポインター
- ファーポインター
- 巨大なポインタ
直接および間接アクセス ポインター
C では、変数のコンテンツにアクセスして操作する同等の方法が 2 つあります
- 直接アクセス:変数名を直接使用します
- 間接アクセス:変数へのポインタを使用します
以下のプログラムの助けを借りてこれを理解しましょう
#include <stdio.h> /* Declare and initialize an int variable */ int var = 1; /* Declare a pointer to int */ int *ptr; int main( void ) { /* Initialize ptr to point to var */ ptr = &var; /* Access var directly and indirectly */ printf("\nDirect access, var = %d", var); printf("\nIndirect access, var = %d", *ptr); /* Display the address of var two ways */ printf("\n\nThe address of var = %d", &var); printf("\nThe address of var = %d\n", ptr); /*change the content of var through the pointer*/ *ptr=48; printf("\nIndirect access, var = %d", *ptr); return 0;}
エラーなしでプログラムをコンパイルすると、結果は次のようになります:
Direct access, var = 1 Indirect access, var = 1 The address of var = 4202496 The address of var = 4202496 Indirect access, var = 48
C のポインター演算
ポインター操作を次の図にまとめます

優先操作(優先)
C ポインターを使用する場合、次の優先順位規則を順守する必要があります。
- 演算子 * と &は、単項演算子 (否定!、インクリメント++、デクリメント–) と同じ優先度です。
- 同じ式で、単項演算子 *、&、!、++、– は右から左に評価されます。
P ポインタが X 変数を指している場合、X を記述できる場所ならどこでも * P を使用できます。
次の式は同等です:
int X =10
int *P =&Y;
上記のコードの場合、以下の式は真です
ExpressionEquivalent ExpressionY=*P+1
*P=*P+10
*P+=2
++*P
(*P)++
Y=X+1
X=X+10
X+=2
++X
X++
後者の場合、括弧が必要です。単項演算子 * と ++ は右から左に評価されるため、括弧がないと、P が指すオブジェクトではなく、ポインター P がインクリメントされます。
以下の表は、C ポインターを処理するときに使用できる算術演算と基本演算を示しています
操作 説明 Assignmentint *P1,*P2P1=P2;
P1 と P2 は同じ整数 variableIncrementation と decrementationInt *P1 を指します。
P1++;P1–;オフセットの追加 (定数)これにより、ポインターはテーブル内の N 要素を移動できます。
ポインターは、変数の型のバイト数の N 倍だけ増減されます。
P1+5;
C ポインターと配列と例
従来、インデックスを使用して配列要素にアクセスしていましたが、この方法はポインタを使用することで省略できます。ポインターを使用すると、各配列要素に簡単にアクセスできます。
#include <stdio.h> int main() { int a[5]={1,2,3,4,5}; //array initialization int *p; //pointer declaration /*the ptr points to the first element of the array*/ p=a; /*We can also type simply ptr==&a[0] */ printf("Printing the array elements using pointer\n"); for(int i=0;i<5;i++) //loop for traversing array elements { printf("\n%x",*p); //printing array elements p++; //incrementing to the next element, you can also write p=p+1 } return 0; }
出力:
1 2 3 4 5
ポインターに特定の数値を追加すると、ポインターの位置が加算演算によって得られた値に移動します。 p が現在メモリ位置 0 を指しているポインタであると仮定すると、次の加算演算 p+1 を実行すると、次のように実行されます:

センター> フィギュア>
p は現在、1 を追加した後の位置 0 を指しているため、値は 1 になり、したがってポインターはメモリ位置 1 を指します。
C ポインタと文字列の例
文字列は、ヌル文字「\ 0」で終わる char オブジェクトの配列です。ポインターを使用して文字列を操作できます。 C の例のこのポインタは、このセクションを説明しています
#include <stdio.h> #include <string.h> int main() { char str[]="Hello Guru99!"; char *p; p=str; printf("First character is:%c\n",*p); p =p+1; printf("Next character is:%c\n",*p); printf("Printing all the characters in a string\n"); p=str; //reset the pointer for(int i=0;i<strlen(str);i++) { printf("%c\n",*p); p++; } return 0; }
出力:
First character is:H Next character is:e Printing all the characters in a string H e l l o G u r u 9 9 !
文字列を処理する別の方法は、次のプログラムのようにポインターの配列を使用することです:
#include <stdio.h> int main(){ char *materials[ ] = { "iron", "copper", "gold"}; printf("Please remember these materials :\n"); int i ; for (i = 0; i < 3; i++) { printf("%s\n", materials[ i ]);} return 0;}
出力:
Please remember these materials: iron copper gold
C におけるポインターの利点
- ポインタはメモリ位置へのアクセスに役立ちます。
- ポインタは、配列構造の要素にアクセスするための効率的な方法を提供します。
- ポインタは、動的メモリ割り当てと解放に使用されます。
- ポインタは、リンクされたリスト、グラフ、ツリーなどの複雑なデータ構造を形成するために使用されます。
C におけるポインタの欠点
- ポインターは理解するのが少し複雑です。
- ポインタは、セグメンテーション違反などのさまざまなエラーを引き起こしたり、まったく必要のないメモリ位置にアクセスしたりする可能性があります。
- ポインタに誤った値を指定すると、メモリが破損する可能性があります。
- ポインタもメモリ リークの原因です。
- ポインターは、変数よりも比較的遅いです。
- プログラマーはポインターを扱うのが非常に難しいと感じています。したがって、ポインタを注意深く操作するのはプログラマの責任です。
まとめ:
- ポインタは、データが保存されるメモリの場所に他なりません。
- メモリ位置へのアクセスにはポインタが使用されます。
- ヌル ポインター、ワイルド ポインター、ボイド ポインター、その他の種類のポインターなど、さまざまな種類のポインターがあります。
- 配列や文字列でポインタを使用すると、より効率的に要素にアクセスできます。
- 関数ポインタを作成して、関数を動的に呼び出すことができます。
- ポインター演算と呼ばれるポインターに対して算術演算を実行できます。
- ポインターは、ポインターの配列を定義する場合にさまざまな関数を簡単に呼び出すことができる関数を指すこともできます。
- 異なる変数のデータ型を扱いたい場合は、型キャストの void ポインターを使用できます。
C言語