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言語