C言語におけるポインタとは、別の変数のアドレスを格納する変数のことです。この変数の型は、int、char、array、function、またはその他のポインタにすることができます。ポインタのサイズはアーキテクチャによって異なります。ただし、32 ビット アーキテクチャでは、ポインターのサイズは 2 バイトです。
整数のアドレスを格納するポインターを定義する次の例を考えてみましょう。
int n = 10; int* p = &n; // Variable p of type pointer is pointing to the address of the variable n of type integer.
ポインタの宣言
C言語のポインタは*(アスタリスク記号)を使って宣言できます。ポインタを逆参照するために使用される間接ポインタとしても知られています。
int *a;//pointer to int char *c;//pointer to char
ポインタの例
ポインタを使用してアドレスと値を出力する例を以下に示します。
上の図からわかるように、ポインタ変数には数値変数、つまり fff4 のアドレスが格納されます。数値変数の値は 50 ですが、ポインタ変数 p のアドレスは aaa3 です。
* ( 間接演算子 )、ポインタ変数 p の値を出力できます。
ブースアルゴリズム
上の図で説明したポインターの例を見てみましょう。
#include int main(){ int number=50; int *p; p=&number;//stores the address of number variable printf('Address of p variable is %x ',p); // p contains the address of the number therefore printing p gives the address of number. printf('Value of p variable is %d ',*p); // As we know that * is used to dereference a pointer therefore if we print *p, we will get the value stored at the address contained by p. return 0; }
出力
Address of number variable is fff4 Address of p variable is fff4 Value of p variable is 50
配列へのポインタ
int arr[10]; int *p[10]=&arr; // Variable p of type pointer is pointing to the address of an integer array arr.
関数へのポインタ
void show (int); void(*p)(int) = &display; // Pointer p is pointing to the address of a function
構造体へのポインタ
struct st { int i; float f; }ref; struct st *p = &ref;
ポインタの利点
1) ポインタ コードを減らす そして パフォーマンスが向上します 、文字列、ツリーなどを取得するために使用され、配列、構造体、関数とともに使用されます。
2) できます 関数から複数の値を返す ポインターを使用して。
3) できるようになります 任意の記憶場所にアクセスする コンピューターのメモリ内にあります。
ポインタの使い方
C言語にはポインタの応用例がたくさんあります。
複数のテーブルSQLから選択
1) 動的メモリ割り当て
C 言語では、ポインタを使用する malloc() および calloc() 関数を使用して動的にメモリを割り当てることができます。
2) 配列、関数、構造体
C 言語のポインタは、配列、関数、構造体で広く使用されています。コードが削減され、パフォーマンスが向上します。
選択範囲の並べ替え
(&) 演算子のアドレス
演算子「&」のアドレスは変数のアドレスを返します。ただし、変数のアドレスを表示するには %u を使用する必要があります。
#include int main(){ int number=50; printf('value of number is %d, address of number is %u',number,&number); return 0; }
出力
value of number is 50, address of number is fff4
NULLポインタ
NULL 以外の値が割り当てられていないポインターは、NULL ポインターと呼ばれます。宣言時にポインタに指定するアドレスがない場合は、NULL値を代入することができます。より良いアプローチが提供されます。
int *p=NULL;
ほとんどのライブラリでは、ポインタの値は 0 (ゼロ) です。
ポインター 3 番目の変数を使用せずに 2 つの数値を交換するプログラム。
#include int main(){ int a=10,b=20,*p1=&a,*p2=&b; printf('Before swap: *p1=%d *p2=%d',*p1,*p2); *p1=*p1+*p2; *p2=*p1-*p2; *p1=*p1-*p2; printf(' After swap: *p1=%d *p2=%d',*p1,*p2); return 0; }
出力
Before swap: *p1=10 *p2=20 After swap: *p1=20 *p2=10
複雑なポインタの読み取り
C で複雑なポインタを読むときに考慮しなければならないことがいくつかあります。ポインタに関して使用される演算子の優先順位と結合性を見てみましょう。
オペレーター | 優先順位 | 結合性 |
---|---|---|
()、[] | 1 | 左から右へ |
*、識別子 | 2 | 右から左に |
データ・タイプ | 3 | - |
ここで、私たちが注目しなければならないのは、
- (): この演算子は、関数の宣言と定義に使用される括弧演算子です。
- []: この演算子は配列添字演算子です
- * : この演算子はポインタ演算子です。
- 識別子: ポインタの名前です。常にこれに優先順位が割り当てられます。
- データ型: データ型は、ポインタが指す変数の型です。 signed int、long などの修飾子も含まれます)。
ポインタの読み方: int (*p)[10]。
ポインタを読み取るには、() と [] の優先順位が等しいことを確認する必要があります。したがって、ここではそれらの結合性を考慮する必要があります。結合性は左から右なので、優先順位は () になります。
Javaランダム数学ランダム
大括弧 () 内では、ポインタ演算子 * とポインタ名 (識別子) p は同じ優先順位を持ちます。したがって、ここでは右から左への結合性を考慮する必要があるため、優先順位は p になり、2 番目の優先順位は * になります。
データ型は最後の優先順位を持つため、3 番目の優先順位を [] に割り当てます。したがって、ポインタは次のようになります。
- 文字 -> 4
- * -> 2
- p -> 1
- [10] -> 3
ポインタは、p がサイズ 10 の整数の配列へのポインタとして読み取られます。
例
次のポインタをどう読むか?
int (*p)(int (*)[2], int (*)void))
説明
このポインタは、 p が最初のパラメータをサイズ 2 の整数の 1 次元配列へのポインタとして受け入れ、2 番目のパラメータを関数へのポインタとして受け入れる関数へのポインタとして読み取られます。パラメータは void で戻り値の型は次のとおりです。整数。