- ここの説明は,後に現れる節の内容を多く含んでいます.理解しにくい場合は,6 章を読み終わってから,もう一度読んでみてください.
- Java にはポインタという言葉はありませんが,ポインタという概念が存在しないわけではありません.むしろ,単純変数(基本形)以外はポインタで参照されていると考えた方が理解しやすいと思います.たとえば,次のプログラムを見てください.
/****************************/
/* 配列とポインタ */
/* coded by Y.Suganuma */
/****************************/
import java.io.*;
public class Test {
/********************/
/* main program */
/********************/
public static void main(String args[])
{
int [] a = new int [3];
int [] b = new int [2];
// 値を設定
a[0] = 1;
a[1] = 2;
a[2] = 3;
b[0] = 10;
b[1] = 20;
// a,bの出力
System.out.println("a " + a[0] + " " + a[1] + " " + a[2]);
// System.out.println("b " + b[0] + " " + b[1] + " " + b[2]); エラー
System.out.println("b " + b[0] + " " + b[1]);
// aをbに代入(配列aのアドレスをbに代入)
b = a;
// bの出力
System.out.println("b(aをbに代入後) " + b[0] + " " + b[1] + " " + b[2]);
// a[0]の値の変更
a[0] = 5;
// a,bの出力
System.out.println("a(a[0]の値を変更後) " + a[0] + " " + a[1] + " " + a[2]);
System.out.println("a(a[0]の値を変更後) " + b[0] + " " + b[1] + " " + b[2]);
}
}
- 変数 a や b が,int 型へのポインタであると考えれば,a を b に代入するといった操作や,a[0] の値を変えると b[0] の値も変化するといった現象を容易に理解できます.実際,上のプログラムを C++ を使用して書けば以下のようになり,全く同じ結果が得られます( new 演算子については,6.4.2 節を参照してください).
/****************************/
/* 配列とポインタ */
/* coded by Y.Suganuma */
/****************************/
#include <iostream>
int main()
{
int *a = new int [3];
int *b = new int [2];
// 値を設定
a[0] = 1;
a[1] = 2;
a[2] = 3;
b[0] = 10;
b[1] = 20;
// a,bの出力
std::cout << "a " << a[0] << " " << a[1] << " " << a[2] << std::endl;
// std::cout << "b " << b[0] << " " << b[1] << " " << b[2] << std::endl; エラー
std::cout << "b " << b[0] << " " << b[1] << std::endl;
// aをbに代入(配列aのアドレスをbに代入)
b = a;
// bの出力
std::cout << "b(aをbに代入後) " << b[0] << " " << b[1] << " " << b[2] << std::endl;
// a[0]の値の変更
a[0] = 5;
// a,bの出力
std::cout << "a(a[0]の値を変更後) " << a[0] << " " << a[1] << " " << a[2] << std::endl;
std::cout << "a(a[0]の値を変更後) " << b[0] << " " << b[1] << " " << b[2] << std::endl;
return 0;
}
- 後の章で現れるクラスについても同様です.あるクラス型の変数を定義する場合,C++ においては,そのクラス型オブジェクト自身と,そこへのポインタが区別されます.従って,ある変数 cl がポインタか否かにより,クラス内の変数等を参照する際に,
cl.val (ポインタでない場合)
cl -> val (ポインタである場合)
- とうい表現上の違いが出てきます.Java の場合は,表面上,ポインタとしての定義はできません.しかし,すべてがポインタとして定義されており,C++ であれば,「->」を使用すべきところを「.」で置き換えていると考えた方が,C++ の立場からは理解しやすいと思います.