記事ディレクトリ
序文
ポインタを使用すると一部の C プログラミング タスクのパフォーマンスが簡素化されますが、動的メモリ割り当てなどの他のタスクはポインタなしでは実行できません。
したがって、優れた C プログラマになりたい場合は、ポインタを学ぶ必要があります。
1. ポインタとは何ですか?
ポインタはメモリアドレスを格納する変数です。
このメモリ アドレスは別の変数の場所を指し、プログラムがその変数の値にアクセスして操作できるようになります。
すべての変数にはメモリ アドレスがあり、メモリ アドレスは です可用 & 运算符取到内存地址
。
ポインタ宣言では * 記号を使用します
// p 是一个指针变量,它存储了一个地址
// *p 是指针 p 所指向的地址上存储的值
int *p;
このステートメントでは、変数 p は整数型のポインタです。& 記号を使用して変数のアドレスを取得できます。
int n = 10;
int *p = &n;
このステートメントでは、&n は変数 n のアドレスを取得し、そのアドレスをポインター p に割り当てます。ポインタ p を通じて、変数 n の値にアクセスし、変更することができます。
*p = 20;
printf("%d", n); // 输出20
※この文において、pはポインタpが指すメモリアドレスに格納されている値を表します。*p に値 20 を割り当てた後、変数 n の値も 20 に変更されます。
次に、ポインタをどのように使用するか?
ポインタ変数を定義し、
変数アドレスをポインタに割り当て、
ポインタ変数で使用可能なアドレスの値にアクセスします。
これらは、単項演算子 * を使用して、オペランドで指定されたアドレスにある変数の値を返すことによって返されます。
1. ポインタの算術演算
- 毎回、ポインタは要素の記憶ユニット
递增
を指します。下一个
- 毎回、ポインタは要素の記憶ユニット
递减
を指します。前一个
- インクリメントおよびデクリメント時にポインタがジャンプするバイト数は に依存します
指针变量数据类型长度
。たとえば、int は 4 バイトです。
ポインタをインクリメントする
#include <stdio.h>
const int MAX = 3;
int main ()
{
int var[] = {
10, 100, 200};
int i, *ptr;
/* 指针中的数组地址 */
ptr = var;
for ( i = 0; i < MAX; i++)
{
printf("存储地址:var[%d] = %p\n", i, ptr );
printf("存储值:var[%d] = %d\n", i, *ptr );
/* 指向下一个位置 */
ptr++;
}
return 0;
}
// 存储地址:var[0] = e4a298cc
// 存储值:var[0] = 10
// 存储地址:var[1] = e4a298d0
// 存储值:var[1] = 100
// 存储地址:var[2] = e4a298d4
// 存储值:var[2] = 200
ポインタの比較
変数ポインタが指すアドレスが配列の最後の要素のアドレス &var[MAX - 1] 以下である限り、変数ポインタはインクリメントされます。
#include <stdio.h>
const int MAX = 3;
int main ()
{
int var[] = {
10, 100, 200};
int i, *ptr;
/* 指针中第一个元素的地址*/
ptr = &var;
i = 0;
while ( ptr <= &var[MAX - 1] )
{
printf("存储地址:var[%d] = %p\n", i, ptr );
printf("存储值:var[%d] = %d\n", i, *ptr );
/* 指向下一个位置 */
ptr++;
i++;
}
return 0;
}
2. ポインタの配列
ptr は、MAX 整数ポインターで構成される配列として宣言されます。
したがって、ptr の各要素は int 値へのポインタです。
int *ptr[MAX];
次の例では、次のようにポインターの配列に格納される 3 つの整数を使用します。
#include <stdio.h>
const int MAX = 3;
int main ()
{
int var[] = {
10, 100, 200};
int i, *ptr[MAX];
for ( i = 0; i < MAX; i++)
{
ptr[i] = &var[i]; /* 赋值为整数的地址 */
}
return 0;
}
3. ポインタからポインタへ
ポインターへのポインターは、マルチレベル間接参照の一種です。ポインタからポインタを定義すると、最初のポインタには 2 番目のポインタのアドレスが含まれ、実際の値が含まれる場所を指します。
int 型のポインタへのポインタ:
int a = 100;
int *p1 = &a;
int **p2 = &p1;
C 言語ではポインターのレベル数に制限がないため、ポインター変数を定義するときにポインターの追加レベルごとにアスタリスク * を追加する必要があります。
p1 は、共通型データを指す第 1 レベルのポインタで、定義時に 1 つの * が付きます。p2 は、第
2 レベルのポインタで、第 1 レベルのポインタ p1 を指し、定義時に 2 つの * が付きます。
4. 関数にポインタを渡します
#include <stdio.h>
void increment(int *ptr) {
(*ptr)++;
}
int main() {
int num = 5;
printf("Before increment: %d\n", num);
increment(&num);
printf("After increment: %d\n", num);
return 0;
}
5. 関数からのポインタを返す
// todo