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);