ポインターは永遠の神だと聞いたので、今日は連絡を取りましょう〜
ポインターを使用すると、Cプログラミングタスクの実行を簡略化でき、動的メモリ割り当てなどのタスクはポインターなしでは実行できません。
ポインター紹介
ポインタは、値が別の変数のアドレス、つまりメモリ位置の直接アドレスである変数です。
例を通して次のポインタを簡単に理解しましょう:
#include <stdio.h>
int main()
{
int var1;
char var2[10];
printf("var1 变量的地址: %p\n", &var1);
printf("var2 变量的地址: %p\n", &var2);
return 0;
}
結果は次のとおりです。
var1変数
のアドレス:008FFAC4 var2変数のアドレス:008FFAB0
ポインタの使用
ポインタを使用する場合、次の操作が頻繁に実行されます。ポインタ変数を定義し、変数アドレスをポインタに割り当て、ポインタ変数で使用可能なアドレスの値にアクセスします。これらは、単項演算子*を使用して、オペランドで指定されたアドレスの変数の値を返すことによるものです。
たとえば、次の例:
#include <stdio.h>
int main ()
{
int var = 20; /* 实际变量的声明 */
int *ip; /* 指针变量的声明 */
ip = &var; /* 在指针变量中存储 var 的地址 */
printf("Address of var variable: %p\n", &var );
/* 在指针变量中存储的地址 */
printf("Address stored in ip variable: %p\n", ip );
/* 使用指针访问值 */
printf("Value of *ip variable: %d\n", *ip );
return 0;
}
動作結果:
var変数の
アドレス:bffd8b3c ip変数に格納されているアドレス:bffd8b3c
* ip変数の値:20
ヌルポインタ
変数宣言で、割り当てる正確なアドレスがない場合は、ポインター変数にNULL値を割り当てることをお勧めします。NULL値が割り当てられたポインターは、nullポインターと呼ばれます。
NULLポインターは、値がゼロの標準ライブラリで定義されている定数です。
ほとんどのオペレーティングシステムでは、アドレス0のメモリはオペレーティングシステムによって予約されているため、プログラムはこのメモリにアクセスできません。ただし、メモリアドレス0は特に重要な意味を持ち、ポインタがアクセス可能なメモリ位置を指していないことを示します。ただし、慣例により、ポインタにnull値(ゼロ値)が含まれている場合は、何も指していないと見なされます。
ポインタ演算
ポインタは値で表されるアドレスであるため、ポインタには++、-、+、-の4つの算術演算があります。
- ポインタの各増分は、次の要素のストレージユニットを指します。
- ポインタの各デクリメントは、前の要素のストレージユニットを指します。
- インクリメントおよびデクリメント中にポインタがジャンプするバイト数は、ポインタが指す変数のデータタイプの長さによって異なります。たとえば、intは4バイトです。
ポインターインクリメント操作
以下は、ポインタの増分操作を伴うポインタの算術演算の簡単な説明です。
#include <iostream>
using namespace std;
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] = %x\n", i, ptr);
printf("存储值:var[%d] = %d\n", i, *ptr);
ptr++;//移动到下一个位置
}
return 0;
}
動作結果:
ストレージアドレス:var [0] = 4c56f568
ストレージ値:var [0] = 10
ストレージアドレス:var [1] = 4c56f56c
ストレージ値:var [1] = 100
ストレージアドレス:var [2] = 4c56f570
ストレージ値:var [ 2] = 200
したがって、ポインタのデクリメント操作は同じ操作です。
ポインターの比較
ポインタは、==、<、>などのリレーショナル演算子と比較できます。p1とp2が、同じ配列内の異なる要素など、2つの関連する変数を指している場合、p1とp2を比較できます。
例えば:
#include <iostream>
using namespace std;
const int MAX = 3;
int main()
{
int var[] = {
10,100,200 };
int i = 0, * ptr;
//指针中的数组地址
ptr = var;
while(ptr <= &var[MAX-1]) //如果变量指针所指向的地址小于或等于数组的最后一个元素的地址,则执行以下操作
{
printf("存储地址:var[%d] = %x\n", i, ptr);
printf("存储值:var[%d] = %d\n", i, *ptr);
ptr++;//移动到下一个位置
i++;
}
return 0;
}
動作結果:
ストレージアドレス:var [0] = 7370fb58
ストレージ値:var [0] = 10
ストレージアドレス:var [1] = 7370fb5c
ストレージ値:var [1] = 100
ストレージアドレス:var [2] = 7370fb60
ストレージ値:var [ 2] = 200
ポインタへのポインタ
ポインタへのポインタは、マルチレベルの間接アドレス指定、またはポインタチェーンの形式です。通常、ポインタには変数のアドレスが含まれています。ポインターへのポインターを定義すると、最初のポインターには2番目のポインターのアドレスが含まれ、2番目のポインターは実際の値を含む場所を指します。
#include <stdio.h>
int main()
{
int var;
int* ptr;
int** pptr;
var = 3000;
/* 获取 var 的地址 */
ptr = &var;
/* 使用运算符 & 获取 ptr 的地址 */
pptr = &ptr;
/* 使用 pptr 获取值 */
printf("Value of var = %d\n", var);
printf("Value available at *ptr = %d\n", *ptr);
printf("Value available at **pptr = %d\n", **pptr);
return 0;
}
動作結果:
var = 3000の
値* ptr = 3000で
利用可能な値** pptr = 3000で利用可能な値