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言語