Mengembalikan Pointer Array 2D dari Fungsi

Ketika kita membuat sebuah variabel yang diinisialisasi dengan pointer, variabel tersebut bisa dilewatkan ke dalam sebuah fungsi dan dikembalikan dalam bentuk alamat (pointer). Ketika berpindah-pindah dari satu fungsi ke fungsi lain, nilai pointer akan berubah secara dinamik (pass by address). Namun, saya mencoba membuat sebuah array 2D dan ingin melewatkan alamat pointer tersebut ke sebuah fungsi, yang nantinya fungsi tersebut akan mengganti isi array kemudian mengembalikan alamat pointer array tersebut. Sayang sekali banyak artikel yang mengatakan bahwa kita tidak bisa melewatkan pointer array 2D melalui fungsi yang telah didefinisikan.

Meskipun pointer array tidak bisa dilewatkan melalui fungsi, namun fungsi masih tetap bisa mengembalikan pointer array 2D. Jadi array 2D dibentuk di dalam fungsi, lalu alamatnya dikembalikan dan selanjutnya bisa dimasukkan ke dalam pointer lain.

Kode di bawah ini adalah cara yang saya temukan di internet. Mungkin ada cara lain, tapi saya belum mengetahuinya 🙂

#include <iostream>
using namespace std;
 
int** editArray();
int main(){
	int i=0, j=0;
	int **arr;
	arr=editArray();
	for(i=0; i<2; i++){
		for(j=0; j<4; j++){
			cout << arr[i][j] << " ";
		}
		cout << endl;
	}
	//system("pause");
}
 
int** editArray(){
	int** tmp;
	tmp = 0;
	tmp = new int*[100]; // 100 baris -> tmp [100][x];
	int i=0;
 
	/* Untuk kemudahan, 2 buah contoh cara memasukkan nilai pada variable
		pada array 'tmp' diberikan dalam 1 fungsi. 
		Silahkan berikan komentar pada baris-baris pada salah satu contoh
		agar 1 cara saja yang dipakai.
	*/
 
	/* Contoh 1: memasukkan nilai awal */
	for(i=0; i<2; i++){
		tmp[i] = new int[4];	// 4 kolom -> tmp[100][4]
		tmp[i][0] = (i+2)*1;
		tmp[i][1] = (i+2)*2;
		tmp[i][2] = (i+2)*3;
		tmp[i][3] = (i+2)*4;
	}
 
	/* Contoh 2: mengedit array */
	tmp[0] = new int[4];
	tmp[0][0]=2;
	tmp[0][1]=3;
	tmp[0][2]=4;
	tmp[0][3]=5;
 
	tmp[1] = new int[4];
	tmp[1][0]=20;
	tmp[1][1]=30;
	tmp[1][2]=40;
	tmp[1][3]=50;
 
    return tmp;
}

Leave a Reply

Your email address will not be published. Required fields are marked *