Array dan Pointer

13.6. Array dan Pointer

equivalen, dan perlu mengerti perbedaan antara memiliki sifat (properties) yang sama. pointer dengan array. Keduanya Perbedaannya, user dapat menggunakan memori yang menentukan nilai lain untuk pointer p lokasinya ditentukan, dimana dimana

Pada bahasan ini programer dan

numbers

akan selalu Identifier suatu array equivalen menunjuk nilai yang sama seperti dengan alamat dari elemen pertama,

numbers

yang telah didefinisikan. p, sedangkan pointer equivalen dengan

variable pointer, alamat elemen pertama yang numbers adalah constant pointer. ditunjuk. Perhatikan deklarasi Karena itu walaupun instruksi diatas veriabel sebagai berikut :

merupakan

benar, tetapi tidak untuk instruksi dibawah ini :

int numbers [20]; int * p;

numbers = p;

maka deklarasi dibawah ini juga karena

adalah array benar :

numbers

(constant pointer), dan tidak ada nilai yang dapat diberikan untuk identifier

p = numbers; konstant (constant identifiers). Perhatikan program dibawah ini:

Program 13.15 #include <conio.h> #include <iostream>

using namespace std;

Direktorat Pembinaan SMK | 2008

Pointer Bahasa Pemrorgraman

int main () {

int numbers[ 5 ]; int * p; p = numbers;

*p = 10 ; p++; *p = 20 ;

p = &numbers[ 2 ]; *p = 30 ; p = numbers + 3 ; *p = 40 ; p = numbers; *(p+ 4 ) = 50 ; for (int n= 0 ; n< 5 ; n++)

cout << numbers[n] << ", " ; getch();

return 0 ; }

Program tersebut setelah dieksekusi maka akan mendapatkan keluaran sebagai berikut: Output : 10, 20, 30, 40, 50,

13.6.1. Pointer dan Array (pointer to array)

Hubungan antara pointer dan maka ptgl akan berisi alamat dari array pada C sangatlah erat. Sebab

elemen array tgl_lahir yang sesungguhnya array secara internal berindeks nol. Instruksi di atas bisa akan diterjemahkan dalam bentuk juga ditulis menjadi pointer. Pembahasan berikut akan memberikan gambaran hubungan ptgl = tgl_lahir; antara pointer dan array. Misalnya dideklarasikan di dalam suatu fungsi

sebab nama array tanpa tanda kurung menyatakan alamat awal dari

static int tgl_lahir[3] = { 01, 09, 64 }; array. Sesudah penugasan seperti di atas,

dan

*ptgl

int *ptgl; dengan sendirinya menyatakan Kemudian diberikan instruksi

elemen pertama (berindeks sama dengan nol) dari array

ptgl = &tgl_lahir[0];

//pointer to

array of integer

tgl_lahir.

2008 | Direktorat Pembinaan SMK

Bahasa Pemrograman Pointer

Beberapa contoh hubungan pointer

13.6.2. Pointer dan String

dan string ditunjukkan pada program berikut.

Program 13.16 #include <conio.h> #include <iostream>

using namespace std;

main() {

/* pnegara menunjuk konstanta string "INDONESIA" */ char *pnegara = "INDONESIA" ; cout<< "String yang ditunjuk oleh pnegara = " ;

puts(pnegara); // printf("%s\n",pnegara);

getch(); return 0 ; }

Hasil keluaran program diatas adalah sebagai berikut String yang ditunjuk oleh pnegara = INDONESIA

Pada program di atas,

char *pnegara = “INDONESIA”;

akan menyebabkan kompiler “INDONESIA” dalam suatu memori, mengalokasikan variabel pnegara

kemudian pointer pnegara akan sebagai variabel pointer yang menunjuk ke lokasi string menunjuk ke obyek bertipe char dan

“INDONESIA”.

menempatkan konstanta

Lokasi awal string

pnegara

I A \0

Gambar 13.11. Pointer menunjuk data

Direktorat Pembinaan SMK | 2008

Pointer Bahasa Pemrorgraman

Pernyataan di atas akan menyerupai akan berisi sebuah address pernyataan seperti dibawah ini:

memory yang tersimpan pada variabel a (setelah ada sebuah

char negara[] = “INDONESIA”; address memory yang di-assign ke variabel a tersebut)

tetapi sebenarnya kedua pernyataan

3. Menuliskan nama sebuah variabel inisialisasi di depan tidaklah tepat

array tanpa indexnya sama. Sebab pnegara adalah pointer

Misalnya dideklarasikan (menyatakan alamat) yang dengan

o float nilai[5], maka penulisan mudah dapat diatur agar menunjuk

nilai artinya sama dengan ke string lain (bukan string

&nilai[0]

“INDONESIA”), sedangkan negara o int b[3][4], maka b[3] adalah adalah array (array menyatakan

sama dengan &b[3][0] dan alamat yang konstan, tak dapat

b[0] adalah sama dengan diubah). Jadi, ada beberapa cara

&b[0][0].

penulisan ekspresi variabel yang Bisa disimpulkan bahwa sebuah menghasilkan sebuah address variabel array yang dituliskan

memory, di antaranya adalah : tanpa kurung siku indexnya adalah

1. Menuliskan ampersand di depan sama dengan address memory sebuah variabel 'normal'

dari elemen pertama array Misalnya a dideklarasikan sebagai

tersebut.

sebuah variabel normal, maka &a

1. Hubungan antara pointer dan akan menghasilkan adress

array. Suatu nama array yang memory dari variabel a tersebut

ditulis tanpa dengan indeksnya

2. Menuliskan nama dari sebuah menunjukkan alamat elemen variabel pointer

pertama dari array (versi 1). Misalnya a dideklarasikan sebuah variabel sebagai int *a, maka a

Program 13.17 #include <conio.h> #include <iostream>

using namespace std;

main() {

static int tgl_lahir[] = { 16 , 4 , 1974 };

int *ptgl; cout << "\nNilai yang ditunjuk oleh ptgl = " << *ptgl;

cout << "\nNilai dari tgl_lahir[0] = " << tgl_lahir[ 0 ];

getch(); return 0 ;

2008 | Direktorat Pembinaan SMK

Bahasa Pemrograman Pointer

2. Hubungan antara pointer dan array. Suatu nama array yang ditulis tanpa dengan indeksnya menunjukkan alamat elemen pertama dari array (versi 2).

Program 13.18 #include <conio.h> #include <iostream>

using namespace std;

main() {

static int tgl_lahir[] = { 16 , 4 , 1974 };

int *ptgl, i; ptgl = tgl_lahir; printf( "Nilai yang ditunjuk oleh ptgl = %d\n" , *ptgl);

for (i= 0 ; i< 3 ; i++) printf( "Nilai dari tgl_lahir[i] = %d\n" , *(ptgl+i)); getch();

return 0 ; }

3. Hubungan antara pointer dan array. Suatu nama array yang ditulis tanpa dengan indeksnya menunjukkan alamat elemen pertama dari array (versi 3).

Program 13.19 #include <conio.h> #include <iostream>

using namespace std;

main() {

static int tgl_lahir[] = { 16 , 4 , 1974 };

int i; int *ptgl; ptgl = tgl_lahir; printf( "Nilai yang ditunjuk oleh ptgl = %d\n" , *ptgl);

for (i= 0 ; i< 3 ; i++) printf( "Nilai dari tgl_lahir[i] = %d\n" , *ptgl++);

Direktorat Pembinaan SMK | 2008

Pointer Bahasa Pemrorgraman

getch(); return 0 ; }

Analisis dan jelaskan perbedaan antara aplikasi pada nomor 1, 2 dan 3

4. Menukarkan isi 2 string tanpa pemakaian pointer.

Program 13.20 #include <stdio.h> #include <string.h> #define PANJANG 20

char nama1[PANJANG] = "AHMAD"; char nama2[PANJANG] = "RIFDA";

main() { char namax[PANJANG]; puts("SEMULA : "); printf("nama1 ‐‐> %s\n", nama1); printf("nama2 ‐‐> %s\n", nama2); strcpy(namax, nama1); strcpy(nama1, nama2); strcpy(nama2, namax); puts("KINI : "); printf("nama1 ‐‐> %s\n", nama1); printf("nama2 ‐‐> %s\n", nama2); }

5. Menukarkan isi 2 string dengan fasilitas pointer.

Program 13.21. Menukarkan isi 2 string dengan fasilitas pointer #include <stdio.h> #include <string.h> char *nama1 = "AHMAD"; char *nama2 = "RIFDA";

main() { char *namax; puts("SEMULA : "); printf("nama1 ‐‐> %s\n", nama1);

2008 | Direktorat Pembinaan SMK

Bahasa Pemrograman Pointer

printf("nama2 ‐‐> %s\n", nama2); namax = nama1; nama1 = nama2; nama2 = namax; puts("KINI : "); printf("nama1 ‐‐> %s\n", nama1); printf("nama2 ‐‐> %s\n", nama2); }

Analisis dan jelaskan perbedaan pada array dan variable index antara aplikasi pada nomor 4

pada pointer, untuk menunjuk dengan nomor 5

suatu nilai data di dalam suatu

6. Mengamati

variable array. penggunaan variable index

persamaan

Program13.22. main() { int nilai[10]={86,75,98,66,56,76,80,95,70,60};

int index, *ip; printf("Mencetak menggunakan array\n"); printf("Daftar nilai siswa\n\n"); for(index=0; index<10; index++) printf("%3d",nilai[index]); puts("\n"); printf("Mencetak menggunakan pointer dan index\n"); printf("Daftar nilai siswa\n\n"); for(index=0; index<10; index++) printf("%3d",*(nilai+index)); puts("\n"); printf("Mencetak menggunakan pointer\n"); printf("Daftar nilai siswa\n\n"); ip=&nilai; for(index=0; index<10; index++) printf("%3d",*ip++); }

13.6.3. Array dari Pointer (Array of Pointer)

Suatu array bisa digunakan char *namahari[10]; untuk menyimpan sejumlah pointer. Sebagai contoh:

Direktorat Pembinaan SMK | 2008

Pointer Bahasa Pemrorgraman

merupakan pernyataan untuk {“Senin”, mendeklarasikan array pointer. Array

“Selasa”,

namahari terdiri dari 10 elemen “Rabu”, berupa pointer yang menunjuk ke “Kamis”, data bertipe char.

“Jumat”, “Sabtu”,

“Minggu”};

Perhatikan contoh dibawah ini,

namahari[0] berisi alamat yang menunjuk ke string “Senin”. namahari[1] berisi alamat yang menunjuk ke string “Selasa”. namahari[2] berisi alamat yang menunjuk ke string “Rabu”. dan sebagainya.

Gambar 13.12. Array pointer Suatu pointer bisa saja menunjuk ke Array pointer bisa diinisialisasi

pointer lain. Gambar berikut sewaktu pendeklarasian. Sebagai

memberikan contoh mengenai contoh:

pointer menunjuk pointer.

static char *namahari[] =

Gambar 13.13. Pointer yang menunjuk pointer

Untuk membentuk rantai pointer int *ptr1; seperti pada gambar di atas, int **ptr2; pendeklarasian yang diperlukan berupa

Perhatikan pada deklarasi di depan: var_x adalah variabel bertipe int.

int var_x; ptr1 adalah variabel pointer yang

2008 | Direktorat Pembinaan SMK

Bahasa Pemrograman Pointer

menunjuk ke data bertipe int. ptr2 diperlukan berupa ptr1 = &var_x; adalah variabel pointer yang Sedangkan supaya ptr2 menunjuk ke menunjuk ke pointer int. (itulah

ptr1, instruksi yang diperlukan adalah sebabnya deklarasinya berupa int **ptr2; ). Agar ptr1 menunjuk ke ptr2 = &ptr1;

variabel var_x, perintah yang

program 13.23 #include <stdio.h> main() {

static char *days[] = {"Sunday", "Monday", "Tuesday",

"Wednesday","Thursday", "Friday", "Saturday"};

int i; for( i = 0; i < 6; ++i ) printf( "%s\n", days[i]);

Program 13.24. Pointer yang menunjuk ke pointer yang lain.

#include <stdio.h> main() {

int a, *b, **c;

a = 155;

b = &a;

c = &b; printf("Nilai a = %d atau %d atau %d\n", a, *b, **c); printf("b = %p = alamat a di memori\n", b); printf("c = %p = alamat b di memori\n", c); printf("alamat c di memori = %p\n", &c);

Program 13.25. Pointer yang menunjuk ke pointer yang lain. #include <stdio.h> main() {

int var_x = 273; int *ptr1; int **ptr2; ptr1 = &var_x; ptr2 = &ptr1; printf("Nilai var_x = *ptr1 = %d\n", *ptr1);

Direktorat Pembinaan SMK | 2008

Pointer Bahasa Pemrorgraman

printf("Nilai var_x = **ptr2 = %d\n\n", **ptr2); printf("ptr1 = &var_x = %p\n", ptr1); printf("ptr2 = &ptr1 = %p\n", ptr2); printf(" &ptr2 = %p\n", &ptr2);

Program 13.26. #include <stdio.h>

main() {

int a, *b, **c;

a = 1975;

b = &a;

c = &b; printf("Nilai a = %d atau %d atau %d\n", a, *b, **c); printf("b = %p = alamat a di memori\n", b); printf("c = %p = alamat b di memori\n", c); printf("alamat c di memori = %p\n", &c);