工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> C言語

C++ ポインタと例

ポインタとは?

C++ では、ポインターは別の変数のアドレスを保持する変数を参照します。通常の変数と同様に、ポインターにはデータ型があります。たとえば、整数型のポインターは、整数型の変数のアドレスを保持できます。文字型のポインタは、文字型の変数のアドレスを保持できます。

ポインターは、メモリ アドレスのシンボリック表現として表示されます。ポインターを使用すると、プログラムは参照渡しをシミュレートできます。また、動的データ構造を作成および操作することもできます。 C++ では、ポインタ変数は、別の変数が指すメモリ内の特定のアドレスを指す変数を参照します。

この C++ チュートリアルでは、次のことを学びます:

C++ のアドレス

C++ ポインターを理解するには、コンピューターがデータを格納する方法を理解する必要があります。

C++ プログラムで変数を作成すると、コンピューター メモリのスペースが割り当てられます。この変数の値は、割り当てられた場所に格納されます。

データが格納されているコンピュータ メモリ内の場所を知るために、C++ は & を提供します。 (参考)演算子。この演算子は、変数が占めるアドレスを返します。

たとえば、x が変数の場合、&x は変数のアドレスを返します。

ポインタ宣言の構文

C++ の宣言は次の構文を取ります:

datatype *variable_name; 

C++ での有効なポインター宣言の例を次に示します。

int    *x;    // a pointer to integer
double *x;    // a pointer to double
float  *x;    // a pointer to float
char   *ch     // a pointer to a character

参照演算子 (&) と参照演算子 (*)

参照演算子 (&) は、変数のアドレスを返します。

逆参照演算子 (*) は、メモリ アドレスに格納されている値を取得するのに役立ちます。

例:

num という名前の変数があり、アドレス 0x234 に格納され、値 28 が格納されている場合。

参照演算子 (&) は 0x234 を返します。

逆参照演算子 (*) は 5 を返します。

例 1:

#include <iostream>
using namespace std;
int main() {
	int  x = 27;  
	int  *ip;        
	ip = &x;       
	cout << "Value of x is : ";
	cout << x << endl;
	cout << "Value of ip is : ";
	cout << ip<< endl;
	cout << "Value of *ip is : ";
	cout << *ip << endl;
	return 0;
}

出力:

仕組み:

コードのスクリーンショットは次のとおりです:

コードの説明:

<オール>
  • iostream ヘッダー ファイルをインポートします。これにより、ヘッダー ファイルで定義された関数をエラーなしで使用できます。
  • 名前空間を呼び出さずにそのクラスを使用するには、std 名前空間を含めます。
  • main() 関数を呼び出します。プログラム ロジックは、この関数の本体内に追加する必要があります。 { は、関数本体の始まりを示します。
  • 整数変数 x を宣言し、値 27 を割り当てます。
  • ポインタ変数 *ip を宣言します。
  • 変数 x のアドレスをポインタ変数に格納します。
  • コンソールにテキストを出力します。
  • 変数 x の値を画面に出力します。
  • コンソールにテキストを出力します。
  • 変数 x のアドレスを出力します。アドレスの値は、変数 ip に格納されました。
  • コンソールにテキストを出力します。
  • ポインタのアドレスに格納されている値を出力します。
  • プログラムは、実行が成功したときに値を返す必要があります。
  • main() 関数の本体の終わり。
  • ポインタと配列

    配列とポインターは、関連する概念に基づいて機能します。ポインターを持つ配列を操作する場合、注意すべき点がいくつかあります。配列名自体は、配列のベース アドレスを示します。つまり、配列のアドレスをポインターに割り当てる場合、アンパサンド (&) を使用しないでください。

    例:

    p = arr;
    

    arr は配列のアドレスを表しているため、上記は正しいです。別の例を次に示します:

    p = &arr;
    

    上記は正しくありません。

    配列を暗黙的にポインターに変換できます。例:

    int arr [20];
    int * ip;
    

    以下は有効な操作です:

    ip = arr;
    

    上記の宣言の後、ip と arr は同等になり、プロパティを共有します。ただし、別のアドレスを ip に割り当てることはできますが、arr には何も割り当てることができません。

    例 2:

    この例は、ポインターを使用して配列をトラバースする方法を示しています:

    #include <iostream>
    using namespace std;
    int main() {
    	int *ip;
    	int arr[] = { 10, 34, 13, 76, 5, 46 };
    	ip = arr;
    	for (int x = 0; x < 6; x++) {
    		cout << *ip << endl;
    		ip++;
    	}
    	return 0;
    }
    

    出力:

    コードのスクリーンショットは次のとおりです:

    コードの説明:

    <オール>
  • 整数ポインタ変数 ip を宣言します。
  • arr という名前の配列を宣言し、6 つの整数を格納します。
  • arr を ip に割り当てます。 ip と arr は同等になります。
  • for ループを作成します。インデックス 0 から 5 までの配列要素を反復処理するために、ループ変数 x が作成されました。
  • ポインタ IP のアドレスに格納されている値を出力します。反復ごとに 1 つの値が返され、合計 6 回の反復が行われます。 endl は、終了行を意味する C++ キーワードです。このアクションにより、各値が出力された後にカーソルを次の行に移動できます。各値は個別の行に出力されます。
  • 反復ごとにポインターを次の int 位置に移動します。
  • for ループの終わり。
  • プログラムは、実行が成功したときに何かを返さなければなりません。
  • main() 関数本体の終わり。
  • NULL ポインタ

    割り当てられる正確なアドレスがない場合は、ポインター変数に NULL を割り当てることができます。宣言時に行う必要があります。このようなポインターは、ヌル ポインターと呼ばれます。その値はゼロで、iostream などの多くの標準ライブラリで定義されています。

    例 3:

    #include <iostream>
    using namespace std;
    int main() {
    	int  *ip = NULL;
    	cout << "Value of ip is: " << ip;
    	return 0;
    }
    

    出力:

    コードのスクリーンショットは次のとおりです:

    コードの説明:

    <オール>
  • ポインター変数 ip を宣言し、それに NULL の値を割り当てます。
  • ポインタ変数 ip の値をコンソールのテキストと一緒に出力します。
  • プログラムは、正常終了時に値を返さなければなりません。
  • main() 関数の本体の終わり。
  • 変数のポインタ

    C++ を使用すると、コンピューターのメモリから直接データを操作できます。

    メモリ空間は、必要に応じて割り当てたり、再割り当てしたりできます。これは、ポインター変数によって可能になります。

    ポインター変数は、別の変数が指すコンピューターのメモリ内の特定のアドレスを指します。

    次のように宣言できます:

    int *p;
    

    または、

    int* p;
    

    you の例では、ポインター変数 p を宣言しました。

    メモリアドレスを保持します。

    アスタリスクは、ポインターを意味する逆参照演算子です。

    ポインタ p は、メモリ アドレス内の整数値を指しています。

    例 4:

    #include <iostream>
    
    using namespace std;
    int main() {
    	int *p, x = 30;
    	p = &x;
    	cout << "Value of x is: " << *p;
    	return 0;
    }
    

    出力:

    コードのスクリーンショットは次のとおりです:

    コードの説明:

    <オール>
  • ポインタ変数 p と値 30 を持つ変数 x を宣言します。
  • 変数 x のアドレスを p に割り当てます。
  • ポインタ変数 p の値をコンソールのテキストと一緒に出力します。
  • プログラムは、正常終了時に値を返さなければなりません。
  • main() 関数の本体の終わり。
  • ポインタの適用

    C++ の関数は、値を 1 つだけ返すことができます。さらに、関数で宣言されたすべての変数は、関数呼び出しスタックに割り当てられます。関数が戻るとすぐに、すべてのスタック変数が破棄されます。

    関数への引数は値で渡され、変数に変更を加えても、渡される実際の変数の値は変更されません。次の例は、この概念を説明するのに役立ちます:-

    例 5:

    #include <iostream>
    
    using namespace std;
    void test(int*, int*);
    int main() {
    	int a = 5, b = 5;
    	cout << "Before changing:" << endl;
    	cout << "a = " << a << endl;
    	cout << "b = " << b << endl;
    
    	test(&a, &b);
    
    	cout << "\nAfter changing" << endl;
    	cout << "a = " << a << endl;
    	cout << "b = " << b << endl;
    	return 0;
    }
    
    void test(int* n1, int* n2) {
    	*n1 = 10;
    	*n2 = 11;
    }
    

    出力:

    コードのスクリーンショットは次のとおりです:

    コードの説明:

    <オール>
  • 2 つの整数パラメータを取る test という名前の関数のプロトタイプを作成します。
  • main() 関数を呼び出します。その本体内にプログラム ロジックを追加します。
  • それぞれの値が 5 の 2 つの整数変数 a と b を宣言します。
  • コンソールにテキストを出力します。 endl (最終行) は、カーソルを移動して、次の行で印刷を開始します。
  • 変数 a の値を他のテキストと一緒にコンソールに出力します。 endl (最終行) は、カーソルを移動して、次の行で印刷を開始します。
  • 変数 b の値を他のテキストと一緒にコンソールに出力します。 endl (最終行) は、カーソルを移動して、次の行で印刷を開始します。
  • 変数 a と b のアドレスをパラメーターとして受け取る test() という名前の関数を作成します。
  • コンソールにテキストを出力します。 \n は、テキストが印刷される前に新しい空白行を作成します。 endl (最終行) は、カーソルを移動して、テキストが印刷された後、次の行で印刷を開始します。
  • 変数 a の値を他のテキストと一緒にコンソールに出力します。 endl (最終行) は、カーソルを移動して、次の行で印刷を開始します。
  • 変数 b の値を他のテキストと一緒にコンソールに出力します。 endl (最終行) は、カーソルを移動して、次の行で印刷を開始します。
  • プログラムは、正常終了時に値を返さなければなりません。
  • main() 関数の本体の終わり。
  • 関数 test() の定義。この関数は、2 つの整数ポインター変数 *n1 および *n2 を取る必要があります。
  • ポインタ変数 *n1 に値 10 を割り当てます。
  • ポインタ変数 *n2 に値 11 を割り当てます。
  • 関数 test() の本体の終わり。
  • 関数 test 内の変数 a と b に新しい値が割り当てられますが、関数呼び出しが完了すると、同じことが外部関数 main に反映されません。

    関数の引数としてポインターを使用すると、変数の実際のアドレスを関数に渡すのに役立ち、変数に対して実行されたすべての変更が外側の関数に反映されます。

    上記の場合、関数 'test' には変数 'a' と 'b' のアドレスがあります。これら 2 つの変数は関数 'test' から直接アクセスできるため、これらの変数に加えられた変更は呼び出し元の関数に反映されます。 「メイン」

    ポインタを使用する利点

    ここに、ポインターを使用する利点があります

    まとめ:


    C言語

    1. C++ の配列 |宣言する |初期化 |配列へのポインタの例
    2. C++ do…while ループと例
    3. C++ ポインタと例
    4. C++ Char データ型と例
    5. C++ 演算子のオーバーロードと例
    6. C++ 構造体と例
    7. C++ の std::list と例
    8. C++ 関数とプログラム例
    9. 例を含む C# コレクションのチュートリアル
    10. C のポインター:C プログラミングのポインターとは何ですか?種類
    11. C - ポインター