LAPORAN RESMI DASAR PEMOGRAMAN
LAPORAN RESMI DASAR POINTER
Ke - 11
Widad Alfiyah Zayyan
1 D4 Telekomunikasi A
2220600013
Moch. Zen Samsono Hadi, ST., [Link].,Ph.D
29 Desember 2020
Praktikum Dasar Programming 1 100
Mike Yuliana-PENS ITS
PRAKTIKUM 11
POINTER 1
A. Tujuan
1. Menjelaskan tentang konsep dari variabel pointer
2. Menjelaskan tentang pointer array
3. Menjelaskan tentang pointer string
B. DASAR TEORI
Konsep Dasar Pointer
Variabel pointer sering dikatakan sebagai variabel yang menunjuk ke obyek lain.
Pada kenyataan yang sebenarnya, variabel pointer berisi alamat dari suatu obyek lain (yaitu
obyek yang dikatakan ditunjuk oleh pointer). Sebagai contoh, px adalah variabel pointer
dan x adalah variabel yang ditunjuk oleh px. Kalau x berada pada alamat memori (alamat
awal) 1000, maka px akan berisi 1000. Sebagaimana diilustrasikan pada gambar 13.1 di
bawah ini
px
zzzz 1000
Address
?
1000
X
Gambar 13.1 Variabel pointer px menunjuk ke variabel x
Mendeklarasikan Variabel Pointer
Suatu variabel pointer dideklarasikan dengan bentuk sebagai berikut :
tipe *nama_variabel
dengan tipe dapat berupa sembarang tipe yang sudah dibahas pada bab-bab sebelumnya,
maupun bab-bab berikutnya. Adapun nama_variabel adalah nama dari variabel pointer.
Praktikum Dasar Programming 1 101
Mike Yuliana-PENS ITS
Sebagai contoh :
int px; / *contoh 1 */
char *pch1, *pch2; / *contoh 2 */
Contoh pertama menyatakan bahwa px adalah variabel pointer yang menunjuk ke suatu
data bertipe int, sedangkan contoh kedua masing pch1 dan pch2 adalah variabel pointer
yang menunjuk ke data bertipe char.
menyatakan variabel
pointer
char *pch1, *pch2; tanda akhir pernyataan deklarasi
nama variabel pointer
tipe data yang ditunjuk
oleh variabel pointer
Gambar 13.2 Ilustrasi pendeklarasian variabel pointer
Mengatur Pointer agar Menunjuk ke Variabel Lain
Agar suatu pointer menunjuk ke variabel lain, mula-mula pointer harus diisi dengan
alamat dari variabel yang akan ditunjuk. Untuk menyatakan alamat dari suatu variabel,
operator & (operator alamat, bersifat unary) bisa dipergunakan, dengan menempatkannya
di depan nama variabel. Sebagai contoh, bila x dideklarasikan sebagai variabel bertipe int,
maka
&x
berarti “alamat dari variabel x”. Adapun contoh pemberian alamat x ke suatu variabel
pointer px (yang dideklarasikan sebagai pointer yang menunjuk ke data bertipe int) yaitu :
px = &x;
Pernyataan di atas berarti bahwa px diberi nilai berupa alamat dari variabel x. Setelah
pernyataan tersebut dieksekusi barulah dapat dikatakan bahwa px menunjuk ke variabel x.
Mengakses Isi Suatu Variabel Melalui Pointer
Jika suatu variabel sudah ditunjuk oleh pointer, variabel yang ditunjuk oleh pointer
tersebut dapat diakses melalui variabel itu sendiri (pengaksesan langsung) ataupun melalui
Praktikum Dasar Programming 1 102
Mike Yuliana-PENS ITS
pointer (pengaksesan tak langsung). Pengaksesan tak langsung dilakukan dengan
menggunakan operator indirection (tak langsung) berupa simbol * (bersifat unary).
Contoh penerapan operator * yaitu :
*px
yang menyatakan “isi atau nilai variabel/data yang ditunjuk oleh pointer px” . Sebagai
contoh jika y bertipe int, maka sesudah dua pernyataan berikut
px = &x;
y = *px;
y akan berisi nilai yang sama dengan nilai x.
Mengakses dan Mengubah isi Suatu Variabel Pointer
Contoh berikut memberikan gambaran tentang pengubahan isi suatu variabel secara
tak langsung (yaitu melalui pointer). Mula-mula pd dideklarasikan sebagai pointer yang
menunjuk ke suatu data bertipe float dan d sebagai variabel bertipe float. Selanjutnya
d = 54.5;
digunakan untuk mengisikan nilai 54,5 secara langsung ke variabel d. Adapun
pd = &d;
digunakan untuk memberikan alamat dari d ke pd. Dengan demikian pd menunjuk ke
variabel d. Sedangkan pernyataan berikutnya
*pd = *pd + 10; (atau: *pd += 10; )
merupakan instruksi untuk mengubah nilai variabel d secara tak langsung. Perintah di atas
berarti “jumlahkan yang ditunjuk pd dengan 10 kemudian berikan ke yang ditunjuk oleh
pd”, atau identik dengan pernyataan
d = d + 10;
Akan tetapi, seandainya tidak ada instruksi
pd = &d;
Praktikum Dasar Programming 1 102
Mike Yuliana-PENS ITS
maka pernyataan
*pd = *pd + 10;
tidaklah sama dengan
d = d + 10;
Pointer dan Array
Hubungan antara pointer dan array pada C sangatlah erat. Sebab sesungguhnya
array secara internal akan diterjemahkan dalam bentuk pointer. Pembahasan berikut akan
memberikan gambaran hubungan antara pointer dan array. Misalnya dideklarasikan di
dalam suatu fungsi
int tgl_lahir[3] = { 01, 09, 64 };
dan
int *ptgl;
Kemudian diberikan instruksi
ptgl = &tgl_lahir[0];
maka ptgl akan berisi alamat dari elemen array tgl_lahir yang berindeks nol. Instruksi di
atas bisa juga ditulis menjadi
ptgl = tgl_lahir;
sebab nama array tanpa tanda kurung menyatakan alamat awal dari array. Sesudah
penugasan seperti di atas,
*ptgl
dengan sendirinya menyatakan elemen pertama (berindeks sama dengan nol) dari array
tgl_lahir.
Praktikum Dasar Programming 1 103
Mike Yuliana-PENS ITS
Kesimpulan
• Tipe variabel pointer adalah tipe variabel yang berisi alamat dari variabel yang
sebenarnya.
• Tipe variabel pointer harus sama dengan tipe variabel yang ditunjuk.
• Hubungan antara pointer dan array pada C sangatlah erat, sebab sesungguhnya array
secara internal akan diterjemahkan dalam bentuk pointer
• Variabel pointer bisa berupa string, array atau tipe variabel yang lainnya.
C. TUGAS PENDAHULUAN
1. Buat program untuk menampilkan sebaris string seperti contoh berikut ;
“Selamat Pagi“ menggunakan variable pointer (pointer to string).
Output
2. Buat potongan program untuk mencetak huruf ketiga ( L ) dari kata :
“P O L I T E K N I K “ dengan menggunakan variabel pointer
Praktikum Dasar Programming 1 104
Mike Yuliana-PENS ITS
D. PERCOBAAN
Untuk setiap program di bawah ini,
- gambarkan ilustrasi alokasi memori dari setiap baris pernyataan yang diproses
- perkirakan hasil eksekusinya,
1. #include <stdio.h>
main()
{
int x = 3, y = 4;
int *ip;
ip = &x;
y = *ip;
x = 10;
*ip = 3;
printf(“x = %d, y = %d”, x, y);
Ilustrasi alokasi memori
Address Value
0x7ffdb4015ce4 X = 3 → 10 → 3
0x3 Y=4→3
0x7ffdb4015ce0 *Ip = 3
Perkiraan Hasil Eksekusi
x=3,y=3
Praktikum Dasar Programming 1 105
Mike Yuliana-PENS ITS
2. #include
<stdio.h>
main()
{
int count = 16, sum = 17, *x, *y;
x = ∑
*x = 27;
y = x;
x = &count;
*x = count;
sum = *x / 2 * 3;
printf("count = %d, sum = %d, *x = %d, *y =
%d\n",count,sum,*x,*y);
}
Ilustrasi alokasi memori
Address Value
0x10 Count = 16
0x18 Sum = 17→16 → 24
0x7ffd65a9f628 *x = 27 → 16
0x7ffd65a9f630 *y = 16 → 24
Perkiraan Hasil Eksekusi
count = 16 , sum = 24, *x = 16 , *y = 24
3. #include <stdio.h>
int r, q = 8;
int go_crazy(int *, int *);
main()
{
int *ptr1 = &q;
int *ptr2 = &q;
r = go_crazy(ptr2, ptr1);
printf("q = %d, r = %d, *ptr1 = %d, *ptr2 = %d\n",
q, r,*ptr1,*ptr2);
ptr1 = &r;
Praktikum Dasar Programming 1 106
Mike Yuliana-PENS ITS
go_crazy(ptr1, ptr2);
printf("q = %d, r = %d, *ptr1 = %d, *ptr2 = %d\n",
q, r,*ptr1,*ptr2);
}
int go_crazy(int *p1, int *p2)
{
int x = 5;
r = 12;
*p2 = *p1 * 2;
p1 = &x;
return *p1 * 3;
}
Ilustrasi alokasi memori
Address Value
0x601048 r
0x601040 q = 8 → 16
0x7ffd9aca9360 *ptr1 = 8 → 16
0x7ffd9aca9368 *ptr2 = 8 → 16
X=5
r = 12 → 15
P1 = 1008
Perkiraan Hasil Eksekusi
q = 16, r = 15, *ptr1 = 16, *ptr2 = 16
Ilustrasi alokasi memori
Address Value
0x601048 r
0x601040 q = 8 → 12 → 24
0x7ffd9aca9360 *ptr1 = 8 → 12 → 24
0x7ffd9aca9368 *ptr2 = 8 → 12 → 24
X=5
r = 12
P1 = 1010
Perkiraan Hasil Eksekusi
q = 24, r = 12, *ptr1 = 12, *ptr2 = 24
Praktikum Dasar Programming 1 107
Mike Yuliana-PENS ITS
4. #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);
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);
}
Ilustrasi alokasi memori
Address Value
0x7ffcd0a5d87c Var_x = 273
0x7ffcd0a5d880 Ptr1 = 273
0x7ffcd0a5d888 Ptr2 = ptr1 → 273
Perkiraan Hasil Eksekusi
Var_x = 273,
ptr1 & ptr2 = var_x
5. int array1[10], array2[10];
int *ip1, *ip2 = array2;
int *akhir = &array1[10];
for(ip1 = &array1[0]; ip1 < akhir; ip1++)
*ip2++ = *ip1;
Ilustrasi alokasi memori
Address Value
0x7ffdcbb3b728 ip1 = -877414552
0x7ffdcbb3b730 ip2 = -877414504
Praktikum Dasar Programming 1 108
Mike Yuliana-PENS ITS
Perkiraan Hasil Eksekusi
ip 1 = -877414552 , ip2 = -877414504
LAPORAN RESMI
a. Kumpulkan listing program, ilustrasi alokasi memorinya beserta hasil eksekusinya
Percobaan 1
Listing:
Ilustrasi alokasi memori:
Address Value
0x7ffdb4015ce4 X = 3 → 10 → 3
0x3 Y=4→3
0x7ffdb4015ce0 *Ip = 3
Hasil Eksekusi:
Praktikum Dasar Programming 1 109
Mike Yuliana-PENS ITS
Percobaan 2
Listing:
Ilustrasi alokasi memory:
Address Value
0x10 Count = 16
0x18 Sum = 17→16 → 24
0x7ffd65a9f628 *x = 27 → 16
0x7ffd65a9f630 *y = 16 → 24
Hasil eksekusi:
Praktikum Dasar Programming 1 110
Mike Yuliana-PENS ITS
Percobaan 3
Listing:
Ilustrasi alokasi memory:
Address Value
0x601048 r
0x601040 q = 8 → 16
0x7ffd9aca9360 *ptr1 = 8 → 16
0x7ffd9aca9368 *ptr2 = 8 → 16
X=5
r = 12 → 15
P1 = 1008
Address Value
0x601048 r
0x601040 q = 8 → 12 → 24
0x7ffd9aca9360 *ptr1 = 8 → 12 → 24
0x7ffd9aca9368 *ptr2 = 8 → 12 → 24
X=5
r = 12
P1 = 1010
Hasil Eksekusi:
Praktikum Dasar Programming 1 111
Mike Yuliana-PENS ITS
Percobaan 4
Listing:
Ilustrasi alokasi memory:
Address Value
0x7ffcd0a5d87c Var_x = 273
0x7ffcd0a5d880 Ptr1 = 273
0x7ffcd0a5d888 Ptr2 = ptr1 → 273
Hasil Eksekusi:
Praktikum Dasar Programming 1 112
Mike Yuliana-PENS ITS
Percobaan 5
Listing:
Ilustrasi alokasi memori:
Address Value
0x7ffdcbb3b728 ip1 = -877414552
0x7ffdcbb3b730 ip2 = -877414504
Hasil Eksekusi:
Praktikum Dasar Programming 1 113
Mike Yuliana-PENS ITS
ANALISIS
Pada praktikum kali ini, dilakukan 4 kali percobaan mengenai penggunaan pointer.
Pada percobaan nomor 1, nilai x = 3, y=4. Kemudian, pada baris ke-6 pada variabel ip
menunjuk alamat x. Selanjutnya, nilai x berubah menjadi 10 melalui perintah x = 10 pada
baris ke-8. Begitu pula nilai y yang ikut berubah menjadi 3 karena terdapat perintah *ip = 3
yang terhubung pada baris ke-7 dimana terdapat y = *ip, maka nilai y secara otomatis
berubah dan nilai x kembali ke nilai semula,yakni x = 3.
Pada percobaan nomor 2, count=16 dan sum= 17. Lalu variabel x menunjuk alamat
variabel sum. Kemudian, nilai dari variabel pointer x (*x) adalah 27, nilai y = x, yakni 27.
variabel x menunjuk alamat dari variabel count. Lalu, nilai *x berubah dari 27 menjadi 16
karena perintah *x = count yang mana count = 16. Nilai sum berubah menjadi 24 karena
terdapat perintah pada baris ke 12, yakni *x / 2 * 3 atau bisa kita tuliskan 16 / 2 x 3 = 24.
Pada percobaan nomor 3, nilai dari *ptr1 = 8 karena int *ptr1 = &q enunjuk alamat q
yang mana bernilai 8. Kemudian terjadi operasi bilangan dari *p2 = *p1 x 2 yang mana p1
menunjuk alamat q yang berinlai 8. Sehingga 8 x 2 = 16. *ptr1 = 8 16 begitu pula yang terjadi
dengan nilai *ptr2 = 8 kemudian menjadi 16. Nilai q juga menjadi 16. Lalu pada printf kedua.
Mulanya nilai pada r = 12 kemudian pada p1 menunjukkan alamat x yang bernilai 5. Dan
terjadi pengoperasian di return *p1*3 = 5x3 = 15 sehingga nilai r berubah menjadi 15.
Diketahui nilai r = 12. Nilai dari *ptr1 = 8 karena int *ptr1= &q menunjuk alamat q yang
mana bernilai 8. Kemudian terjadi operasi bilangan dari *p2 = *p1 x 2 yang mana p1
menunjuk alamat q yang berinlai 12. Sehingga 12 x 2 = 24. *ptr1 = 12 begitu pula yang
terjadi dengan nilai *ptr2 = 12 kemudian menjadi 24. Nilai q juga menjadi 24.
Percobaan nomor 4, int *ptr1, int *ptr2 . Artinya int *ptr2 menunjuk nilai dari *ptr1,
sementara nilai dari *ptr1 sama dengan var_x. Maka dari itu ketiga nilai variabel tersebut
sama, yaitu 273. ptr1 menunjuk alamat dari var_x yang ditandai dengan penggunaan
ampersand, ketika di cetak akan ditampilkan alamat var_x. Pada baris selanjutnya atau baris
ke-11, ptr2 menunjuk alamat ptr1, maka akan ditampilkan alamat dari ptr1, yaang
diasumsikan 1002. Pada baris ke 12, terdapat printf &ptr2 untuk memanggil alamat dari
variabelnya sendiri, maka akan ditampilkan alamat dari variabel ptr 2. Dengan begitu
pointer dapat menunjuk pointer lain, dengan cara mendeklarasikan variabel pointer terlebih
dahulu.
Pada percobaan nomor 5 nilai yang keluar dari aaray1 maupun array2 nilainya tidak
diinputkan sejak awal. Akan tetapi disini terjadi proses looping sehingga komputer
memberikan nilai secara acak agar program bisa berjalan.
KESIMPULAN
Dengan dilakukannya percobaan kali ini, dapat disimpulkan bahwa kegunaan pointer adalah
sebagai modifikasi saat kita ingin mengolah data/variable menggunakan jalan lain. Sehingga
alur yang digunakan tidak hanya menggunakan fungsi/program yang itu-itu saja.
Praktikum Dasar Programming 1 114
Mike Yuliana-PENS ITS