↓↓クリックして頂けると励みになります。
【19 | 配列】 << 【ホーム】 >> 【21 | 構造体】
C++のポインター配列(Pointer Array)は、ポインターを要素として持つ配列のことです。
各要素は、他の変数やオブジェクトのアドレスを指し示すポインターです。
ポインター配列は、多くの場面で便利に使用されます。
主な用途は、動的なメモリ割り当てや、複数のデータへのアクセスを効率的に行うことです。
ポインター配列は、配列の各要素がポインターであるため、実際のデータがどこに格納されているかについて柔軟性があります。
これにより、動的なデータ構造の作成や、関数へのポインター配列の渡し方など、多くの便利な機能を実現できます。
Visual Studio Codeで以下のcppファイルを作成して下さい。
新規作成 【Hairetsu3.cpp】
#include <iostream> int main() { int array[20]; std::cout << "配列arrayのアドレス" << std::endl; std::cout << "array :" << array << " = &array[0]: " << &array[0] <<std::endl; }
配列のアドレスを確認するプログラムです。
配列のアドレスは配列名だけで表示できます。
std::cout << 配列名;
このアドレスが配列のどこを指しているかというと、配列の先頭を指しています。
ですので以下のアドレス演算子&を使用した記述も同じアドレスを示します。
std::cout << &配列名[0];
サンプルプログラム実行してみましょう。
~/Desktop/Programming/CPP $ cd "/Users/**/Desktop/Programming/CPP/" && g++ Hairetsu3.cpp -o Hairetsu3 && "/Users/** /Desktop/Programming/CPP/"Hairetsu3 配列arrayのアドレス array :0x7ff7b1db61a0 = &array[0]: 0x7ff7b1db61a0
Visual Studio Codeで以下のcppファイルを作成して下さい。
新規作成 【Hairetsu4.cpp】
#include <iostream> int main(){ const char *s = "array"; int i; for(i=0; *(s+i)!='\0'; i++ ){ std::cout << *(s+i); } std::cout << std::endl; for(i=0; s[i]!='\0'; i++){ std::cout << s[i]; } std::cout << std::endl; }
ポインタを値に持つような配列も宣言可能です。
例えば整数型へのポインタであり大きさ10の配列は次のように宣言できます。
int *parray[10];
ポインタ配列でも複数の配列を一度に宣言できます。
ただしアスタリスク*
はそれぞれの配列名の前につけなければなりません。
int *pa1[10], *pa2[10], *pa3[20];
整数へのアドレスを10個保持できる配列pa1、 pa2、 同じく20個保持できる配列pa3が確保されたという意味になります。
また文字型に対するポインタの配列も考えられます。
char *pastr[3];
使うときには次のようにして行います。
const char *pastr[3]; pastr[0] = "This is "; pastr[1] = "That is "; pastr[2] = "These are ";
一般に配列要素とアドレスとの関係は次のようになっています。
array[n] <=> *(array + n)
サンプルプログラムでも、このことが証明されています。
~/Desktop/Programming/CPP $ cd "/Users/**/Desktop/Programming/CPP/" && g++ Hairetsu4.cpp -o Hairetsu4 && "/Users/** /Desktop/Programming/CPP/"Hairetsu4 array array
Visual Studio Codeで以下のcppファイルを作成して下さい。
新規作成 【Hairetsu5.cpp】
#include <iostream> #include <stdlib.h> int main() { const char *pastr[3]; const char *a = "「すごい」"; const char *b = "「とても、すごい」"; const char *c = "「かなり、すごい」"; *pastr = a; *(pastr+1) = b; *(pastr+2) = c; int i; for (i=0; i<20; i++){ int random = rand()%3; std::cout << *(pastr+random) << std::endl; } }
文字列へのポインタ配列を利用し、ランダムにコメントが20行表示されるプログラムです。
*pastr = a; *(pastr+1) = b; *(pastr+2) = c;
の部分は次のように書き換え可能です。
pastr[0] = a; pastr[1] = b; pastr[2] = c;
サンプルプログラムを実行してみましょう。
~/Desktop/Programming/CPP $ cd "/Users/**/Desktop/Programming/CPP/" && g++ Hairetsu5.cpp -o Hairetsu5 && "/Users/** /Desktop/Programming/CPP/"Hairetsu5 「とても、すごい」 「とても、すごい」 「かなり、すごい」 「かなり、すごい」 「とても、すごい」 「かなり、すごい」 「すごい」 「かなり、すごい」 「かなり、すごい」 「とても、すごい」 「すごい」 「かなり、すごい」 「すごい」 「かなり、すごい」 「すごい」 「かなり、すごい」 「とても、すごい」 「とても、すごい」 「とても、すごい」 「とても、すごい」
Visual Studio Codeで以下のcppファイルを作成して下さい。
新規作成 【Hairetsu6.cpp】
#include <iostream> int main() { const char *name[10]; name[0]="sasaki"; name[1]="yamada"; name[2]="tanaka"; name[3]="suzuki"; name[4]="okada"; name[5]="ono"; name[6]="sakata"; name[7]="satou"; name[8]="ishida"; name[9]="ueno"; const char *p; int i; for(i=0; i<10; i++) { p=name[i]; while(*p!='\0'){ if(*p=='o') { std::cout << name[i] << std::endl; break; } p++; } } }
ポインタ配列に人の名前が入っています。
この中から文字"o"を含む人の名前だけを表示するプログラムです。
まずwhile文で文字列の最後までループさせています。
そのループの中でif文で、文字が'o'だったら画面に出力させます。
このままでは"ono"のように同じ文字列に2回出てくる場合に画面に2つ出力されてしまいますので、出力したらbreakでループから抜けるようにしています。
~/Desktop/Programming/CPP $ cd "/Users/**/Desktop/Programming/CPP/" && g++ Hairetsu6.cpp -o Hairetsu6 && "/Users/** /Desktop/Programming/CPP/"Hairetsu6 okada ono satou ueno
【19 | 配列】 << 【ホーム】 >> 【21 | 構造体】
↓↓クリックして頂けると励みになります。