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

C++ ポインターと配列

C++ ポインタと配列

このチュートリアルでは、例を使って配列とポインターの関係について学びます。

C++ では、ポインターは他の変数のアドレスを保持する変数です。ポインターは、単一の変数のアドレスを格納できるだけでなく、配列のセルのアドレスも格納できます。

次の例を考えてみましょう:

int *ptr;
int arr[5];

// store the address of the first
// element of arr in ptr
ptr = arr;

ここで、ptr arr の間はポインタ変数です int です 配列。コード ptr = arr; 配列の最初の要素のアドレスを変数 ptr に格納します .

arr を使用していることに注意してください &arr[0] の代わりに .これは、どちらも同じだからです。したがって、以下のコードは上記のコードと同じです。

int *ptr;
int arr[5];
ptr = &arr[0];

残りの配列要素のアドレスは &arr[1] で指定されます 、 &arr[2]&arr[3] 、および &arr[4] .


すべての配列要素を指す

同じポインタ ptr を使用して、配列の 4 番目の要素を指す必要があるとします。 .

ここで、 ptr の場合 上記の例の最初の要素を指し、次に ptr + 3 を指します 4 番目の要素を指します。たとえば、

int *ptr;
int arr[5];
ptr = arr;

ptr + 1 is equivalent to &arr[1];
ptr + 2 is equivalent to &arr[2];
ptr + 3 is equivalent to &arr[3];
ptr + 4 is equivalent to &arr[4];

同様に、単一のポインターを使用して要素にアクセスできます。たとえば、

// use dereference operator
*ptr == arr[0];
*(ptr + 1) is equivalent to arr[1];
*(ptr + 2) is equivalent to arr[2];
*(ptr + 3) is equivalent to arr[3];
*(ptr + 4) is equivalent to arr[4];

ptr = &arr[2]; を初期化したとします。 それから

ptr - 2 is equivalent to &arr[0];
ptr - 1 is equivalent to &arr[1]; 
ptr + 1 is equivalent to &arr[3];
ptr + 2 is equivalent to &arr[4];
<図>

注: ptr の間のアドレス そして ptr + 1 4バイト違います。 ptr が原因です int へのポインタです データ。また、int のサイズは 64 ビット オペレーティング システムでは 4 バイトです。

同様に、ポインタ ptr の場合 char を指しています データを入力し、ptr の間のアドレス そして ptr + 1 1バイトです。文字の大きさが1バイトだからです。


例 1:C++ ポインターと配列

// C++ Program to display address of each element of an array 

#include <iostream>
using namespace std;

int main()
{
    float arr[3];

    // declare pointer variable
    float *ptr;
    
    cout << "Displaying address using arrays: " << endl;

    // use for loop to print addresses of all array elements
    for (int i = 0; i < 3; ++i)
    {
        cout << "&arr[" << i << "] = " << &arr[i] << endl;
    }

    // ptr = &arr[0]
    ptr = arr;

    cout<<"\nDisplaying address using pointers: "<< endl;

    // use for loop to print addresses of all array elements
    // using pointer notation
    for (int i = 0; i < 3; ++i)
    {
        cout << "ptr + " << i << " = "<< ptr + i << endl;
    }

    return 0;
}

出力

Displaying address using arrays: 
&arr[0] = 0x61fef0
&arr[1] = 0x61fef4
&arr[2] = 0x61fef8

Displaying address using pointers: 
ptr + 0 = 0x61fef0
ptr + 1 = 0x61fef4
ptr + 2 = 0x61fef8

上記のプログラムでは、最初にポインター変数 ptr を使用せずに、配列要素のアドレスを単純に出力しました。 .

次に、ポインター ptr を使用しました a[0] のアドレスを指す 、 ptr + 1 a[1] のアドレスを指す などです。


ほとんどのコンテキストでは、配列名はポインターに分解されます。簡単に言えば、配列名はポインターに変換されます。これが、ポインターを使用して配列の要素にアクセスできる理由です。

ただし、ポインターと配列は同じではないことに注意してください。

配列名がポインターに変化しない場合がいくつかあります。詳細については、次を参照してください:配列名がポインターに分解されないのはいつですか?


例 2:ポインターとして使用される配列名

// C++ Program to insert and display data entered by using pointer notation.

#include <iostream>
using namespace std;

int main() {
    float arr[5];
    
   // Insert data using pointer notation
    cout << "Enter 5 numbers: ";
    for (int i = 0; i < 5; ++i) {

        // store input number in arr[i]
        cin >> *(arr + i) ;

    }

    // Display data using pointer notation
    cout << "Displaying data: " << endl;
    for (int i = 0; i < 5; ++i) {

        // display value of arr[i]
        cout << *(arr + i) << endl ;

    }

    return 0;
}

出力

Enter 5 numbers: 2.5
3.5
4.5
5
2
Displaying data: 
2.5
3.5
4.5
5
2

ここで、

<オール> <リ>

最初にポインター表記を使用して、ユーザーが入力した数値を配列 arr に格納しました。 .

cin >> *(arr + i) ;

このコードは以下のコードと同等です:

cin >> arr[i];

別のポインター変数を宣言していないことに注意してください。代わりに、配列名 arr を使用しています。 ポインター表記について。

すでに知っているように、配列名 arr 配列の最初の要素を指します。 arr を考えることができます。 ポインターのように振る舞う.

<リ>

同様に、for を使用しました arr の値を表示するためのループ ポインター表記を使用します。

cout << *(arr + i) << endl ;

このコードは

と同等です
cout << arr[i] << endl ;

C言語

  1. C++ の変数、リテラル、および定数
  2. C++ クラスとオブジェクト
  3. C++ メモリ管理:新規および削除
  4. C++ の公開、保護、非公開の継承
  5. C++ フレンド関数とフレンド クラス
  6. C ポインタ
  7. 配列とポインタの関係
  8. C パスのアドレスとポインター
  9. C 構造体とポインター
  10. C ++の構造とクラス
  11. C++ の配列 |宣言する |初期化 |配列へのポインタの例