Anda di halaman 1dari 10

Modul 7

Pointer

1. Tujuan Praktikum

 Mengenali alamat dan pointer


 Mengetahui variasi pointer
 Mengetahui ragam penggunaan pointer

2. Alat dan Bahan

 Text Editor (bebas, disarankan Visual Studio Code)


 Compiler gcc, MinGW-w64 pada Windows 64-bit, MinGW pada Windows 32-
bit

3. Teori Dasar

 Alamat dan Pointer

Pointer merupakan fitur yang memungkinkan pengaksesan data melalui


variabel lain. Pointer sendiri sesungguhnya berisi alamat suatu data, bukan data
sebagaimana variabel yang telah dikenal sebelumnya. Seperti yang diketahui,
setiap byte di dalam memori computer memiliki alamat.

Di dalam memori inilah variabel disimpan. Suatu pointer di dalam


program dimaksudkan untuk menunjuk ke suatu alamat memori. Sebagai
contoh, kalau pint adalah pointer, dan vint adalah variabel yang terletak di dalam
memori beralamat 0x28fee8, maka pointer pint dapat diatur agar menunjuk ke
variabel vint seperti yang dapat dilihat pada gambar di bawah.
 Deklarasi, Pengisian Variabel Pointer, serta Pengaksesan Nilai yang Ditunjuk
Pointer

Suatu variabel pointer dideklarasikan dengan bentuk seperti berikut:

tipe_data nama_variabel;

Contoh:

 int *pint; // pointer ke int


 char *pch; // pointer ke char
 float *pfl; // pointer ke float

Selain dideklarasikan, sebuah pointer perlu diisi seperti contoh berikut:

int vint = 55;


int *pint;

pint = &vint;

Lalu untuk mengakses nilai dari variabel pada pointer tersebut, cukup
dengan memanggil pointer tersebut seperti pada contoh berikut

printf(“Nilai yang ditunjuk oleh pint: %d\n”, *pint)

Di mana *pint adalah pointer yang menunjuk pada alamat yang berisi
nilai dari vint sebelumnya
 Pointer menunjuk pointer

Suatu pointer dapat menunjuk ke pointer lain. Untuk membentuk rantai


pointer seperti yang terlihat pada gambar di atas, maka diperlukan deklarasi
seperti berikut:
int var_x;
int *ptr1;
int **ptr2;

Keterangan:

o var_x adalah variabel bertipe int.


o ptr1 adalah variabel pointer yang menunjuk ke data bertipe int.
o ptr2 adalah variabel pointer yang menunjuk ke pointer int.

Agar ptr1 menunjuk ke variabel var_x, perintah yang diperlukan berupa:

ptr1 = &var_x;

Supaya ptr2 menunjuk ke ptr1, diperlukan perintah berupa:

ptr2 = &ptr1;
 Pointer void

Sebenarnya dimungkinkan untuk membuat pointer yang tidak bertipe.


Caranya adalah dengan meletakkan kata kunci void pada bagian penentu tipe
pointer. Contoh: void *ptr;
Contoh pernyataan tersebut adalah pernyataan untuk mendeklarasikan
ptr sebagai variabel pointer void. Suatu pointer void adalah pointer yang dapat
menunjuk ke sembarang tipe data seperti yang dapat dilihat pada gambar di
atas. Sebagai contoh, kalian dapat mengatur agar pointer ini menunjuk ke tipe
data int, tetapi di saat yang lain diperlukan untuk menunjuk data bertipe float.

 Pointer konstan

Pointer konstan berlaku seperti variabel konstan (konstanta bernama).


Isinya tidak dapat diubah. Sebagai contoh:

char bahasa[] = "Bahasa C";


char * const ptr = bahasa;
 Pointer & Array

Pointer dan array mempunyai hubungan yang dekat. Secara internal,


array juga menyatakan alamat. Sebagai contoh, dideklarasikan:

int tgl_lahir[] = { 24, 6, 1965 };


int *ptgl;

Agar ptgl menunjuk ke array, diperlukan pernyataan berupa:

ptgl = tgl_lahir;

Perhatikan dengan seksama pernyataan di atas. Tidak ada tanda & di


depan tgl_lahir. Padahal, beberapa contoh di depan menggunakan format:

ptgl = &variabel;

Bila variabel bukan berupa array. Hal ini disebabkan nama array
sebenarnya sudah menyatakan alamat. Oleh karena itu, tanda & tidak
diperlukan.

 Pointer & Fungsi


Pointer biasa digunakan di dalam argumen fungsi kalau nilai argumen
dimaksudkan untuk diubah di dalam fungsi. Selain itu suatu fungsi dapat dibuat
agar keluarannya berupa pointer.
o Pointer sebagai Argumen Fungsi

Terdapat sebuah variabel dengan nama pinokio yang dapat dilihat


pada pernyataan berikut:

int pinokio = 80;

Kemudian terdapat sebuah fungsi dengan parameter yaitu sebuah


pointer dengan deklarasi sebagai berikut:

void ubah_nilai (int *x);


Pada fungsi ubah_nilai, dilakukan pengubahan nilai terhadap
variabel argumen pada fungsi tersebut yang dapat dilihat pada
pernyataan sebagai berikut:

*x = 95;

Kemudian fungsi ubah_nilai tersebut dipanggil dengan


pernyataan sebagai berikut untuk merubah nilai dari variabel pinokio
sebelumnya:

ubah_nilai(&pinokio);

o Pointer sebagai Keluaran Fungsi

Terdapat sebuah fungsi dengan nama nama_bulan dan tipe


keluaran yaitu pointer pada tipe char dengan deklarasi sebagai berikut:

char *nama_bulan(int n);

Pada fungsi nama_bulan, mula-mula array bernama bulan


dideklarasikan secara statis (supaya dideklarasikan sekali saja) dan
sekaligus diberi nilai awal. Di bagian akhir fungsi, terdapat pernyataan:

return (( n < 1 || n > 12) ? bulan[0] : bulan[n]);

yang menyatakan bahwa nilai balik fungsi berupa pointer yang menunjuk
ke:
 String “Kode bulan salah” ( bulan[0] ), jika argument fungsi
bernilai kurang dari 1 atau lebih besar daripada 12.
 bulan[n], jika argumen n bernilai antara 1 sampai dengan 12

Selengkapnya dapat dilihat pada contoh praktikum untuk bagian ini.


4. Praktikum

 Alamat dan Pointer


Source Code
#include <stdio.h>

int main() {
int a = 5;
float b = 7.5;
double c = 17.77;

printf("Isi variabel:\n");
printf("a = %d\n", a);
printf("b = %f\n", b);
printf("c = %lf\n", c);

printf("\nAlamat variabel:\n");
printf("a = %p\n", &a);
printf("b = %p\n", &b);
printf("c = %p\n", &c);

return 0;
}

Hasil Eksekusi Program


Isi variabel:
a = 5
b = 7.500000
c = 17.777000

Alamat variabel:
a = 000000000061FE4C
b = 000000000061FE48
c = 000000000061FE40

 Deklarasi, Pengisian Variabel Pointer, serta Pengaksesan Nilai yang Ditunjuk


Pointer
Source Code
#include <stdio.h>

int main() {
int vint = 55;
int *pint;
pint = &vint;

printf("Alamat vint = %p\n", &vint);


printf("pint = %p\n", pint);
printf("Nilai yang ditunjuk oleh pint = %d", *pint);

return 0;
}
Hasil Eksekusi Program
Alamat vint = 000000000061FE44
pint = 000000000061FE44
Nilai yang ditunjuk oleh pint = 55

 Pointer menunjuk pointer


Source Code
#include <stdio.h>

int main() {
int var_x = 273;
int *ptr1; // Pointer menunjuk variabel bukan pointer
int **ptr2; // Pointer menunjuk ke pointer

printf("var x = %d\n", var_x);

// Penugasan alamat
ptr1 = &var_x; // ptr1 menunjuk var_x
ptr2 = &ptr1; // ptr2 menunjuk ptr1

// Mengakses nilai var_x via ptr1


printf("*ptr1 = %d\n", *ptr1);

// Mengakses nilai var_x via ptr2


printf("**ptr2 = %d\n", **ptr2);

return 0;
}

Hasil Eksekusi Program


var_x = 273
*ptr1 = 273
**ptr2 = 273

 Pointer void
Source Code
#include <stdio.h>

int main() {
void *ptr; // Pointer tak bertipe

int vint = 50;


float vfl = 5.5;

ptr = &vint; // Menunjuk ke data dengan tipe data int


printf("Nilai yang ditunjuk ptr: %d\n", *(int *) ptr);

ptr = &vfl; // Menunjuk ke data dengan tipe data float


printf("Nilai yang ditunjuk ptr: %f\n", *(float *) ptr);

return 0;
}

Hasil Eksekusi Program


Nilai yang ditunjuk ptr: 50
Nilai yang ditunjuk ptr: 5.500000
 Pointer konstan
Source Code
#include <stdio.h>

int main() {
char bahasa[10] = "C";

char * const ptr = bahasa;


printf("ptr = %s\n", ptr);

// Lakukan perubahan melalui pointer


*(ptr + 1) = '#';
*(ptr + 2) = '\0'; // Karakter NULL

printf("ptr = %s\n", ptr);

return 0;
}

Hasil Eksekusi Program


ptr = C
ptr = C#

 Pointer & Array


Source Code
#include <stdio.h>

int main() {
int tgl_lahir[] = { 24, 6, 1965 };
int *ptgl;

ptgl = tgl_lahir;

// Menampilkan isi array via pointer


for (int i = 0; i < sizeof(tgl_lahir) / sizeof(int); i++) {
printf("%d\n", *(ptgl + i));
}

return 0;
}

Hasil Eksekusi Program


24
6
1965
 Pointer & Fungsi (Pointer sebagai Argumen Fungsi)
Source Code
#include <stdio.h>

void ubah_nilai(int *x);

int main() {
int pinokio = 80;
printf("Nilai pinokio semula = %d\n", pinokio);

ubah_nilai(&pinokio);
printf("Nilai pinokio sekarang = %d\n", pinokio);

return 0;
}

void ubah_nilai(int *x) {


*x = 95;
}

Hasil Eksekusi Program


Nilai pinokio semula = 80
Nilai pinokio sekarang = 95

 Pointer & Fungsi (Pointer sebagai Keluaran Fungsi)


Source Code
#include <stdio.h>

char *nama_bulan(int n);

int main() {
int kode;

printf("Masukkan bulan (1..12): ");


scanf("%d", &kode);

printf("%s\n", nama_bulan(kode));

return 0;
}

char *nama_bulan(int n) {
static char bulan[13][17] = {
"Kode bulan salah", "Januari", "Februari", "Maret",
"April", "Mei",
"Juni", "Juli", "Agustus", "September", "Oktober",
"November", "Desember"
};
return ((n < 1 || n > 12) ? bulan[0] : bulan[n]);
}

Hasil Eksekusi Program


Masukkan bulan (1..12): 1
Januari

Anda mungkin juga menyukai