学生向けプログラミング入門 | 無料

学生向けにプログラミングを無料で解説。Java、C++、Ruby、PHP、データベース、Ruby on Rails, Python, Django

C++ | 20 | ポインター配列

↓↓クリックして頂けると励みになります。



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 | 構造体




↓↓クリックして頂けると励みになります。