Belajar C++ #10 : POINTER

Himtika Avatar

·

·

Pointer

Alamat

Jika kita memiliki variabel nilai dalam program c++ yang kita buat, maka & nilai akan memberitahu alamat memori nya. Sebagai contoh:

Contoh 1:

#include <iostream>
using namespace std;
int main()
{
 int nilai_absen = 85;
 int nilai_tugas = 90;
 int nilai_uts = 70;
 
 cout << "Alamat dari nilai absen: "<< &nilai_absen << endl;
 cout << "Alamat dari nilai tugas: " << &nilai_tugas << endl;
 cout << "Alamat dari nilai uts: " << &nilai_uts << endl;
}

Output :

Copied!
Alamat dari nilai absen: 0x76761ffc8c Alamat dari nilai tugas: 0x76761ffc88 Alamat dari nilai uts: 0x76761ffc84 Catatan: 0x diawal alamat memori mewakili alamat dalam bentuk heksadesima

Pointer

Pointer digunakan untuk menyimpan alamat daripada nilai. Berikut merupakan cara untuk mendeklarasikan pointer:

Copied!
int *variabelPointer; int* variabelPointer; Catatan: operator * digunakan setelah tipe data untuk mendeklarasikan pointer

Menetapkan alamat ke pointer

Untuk menetapkan alamat ke dalam pointer maka gunakan cara seperti berikut:

Copied!
int* variabelPointer, var;
var = 10;
variabelPointer = &var;

Mendapatkan nilai dari alamat menggunakan pointer

Untuk mendapatkan nilai yang ditunjuk oleh pointer, maka kita bisa menggunakan operator * seperti berikut:

Copied!
int* variabelPointer, var; var = 10; variabelPointer = &var; cout << *variabelPointer << endl; Catatan: Pada saat kita menggunakan * dengan pointer, maka hal tersebut dinamakan dengan operator dereference. Ini beropasi pada pointer dan memberikan nilai yang ditunjukkan oleh alamat yang disimpan di pointer yaitu *variabelPointer = var

Contoh 2:

#include <iostream>
using namespace std;
int main() {
    int var = 10;
    int* variabelPointer;
    variabelPointer = &var;
    
    cout << "var = " << var << endl;
    cout << "Alamat dari vari (&var) = " << &var << endl << endl;
    cout << "Variabel Pointer = " << variabelPointer << endl;
    cout << "Isi alamat yang ditunjuk oleh variabelPointer = " << *variabelPointer << endl;
 return 0;
}

Output :

Copied!
var = 10 Alamat dari vari (&var) = 0xeb7c9ff924 Variabel Pointer = 0xeb7c9ff924 Isi alamat yang ditunjuk oleh variabelPointer = 10

Cara mengubah nilai yang ditunjuk oleh pointer

Jika variabelPointer menunjuk ke alamat var, maka kita dapat mengubah nilai dari var dengan menggunakan *variabelPointer. Sebagai contoh:

Copied!
int var = 10; int* variabelPointer; variabelPointer = &var; *variabelPointer = 7; Cout << var;

Contoh 3:

#include <iostream>
using namespace std;
int main() {
    int var = 9;
    int* variabelPointer;
    variabelPointer = &var;

    cout << "var = " << var << endl;
    cout << "*variabelPointer = " << *variabelPointer << endl << endl;
    cout << "Merubah nilai yang ada di variabel var menjadi 7:" << endl;

    var = 7;

    cout << "var = " << var << endl;
    cout << "*variabelPointer = " << *variabelPointer << endl << endl;
    cout << "Merubah nilai *variabelPointer menjadi 3:" << endl;
    
    *variabelPointer = 3;
    cout << "var = " << var << endl;
    cout << "*variabelPointer = " << *variabelPointer << endl;
 return 0;
}

Output :

Copied!
var = 9 *variabelPointer = 9 Merubah nilai yang ada di variabel var menjadi 7: var = 7 *variabelPointer = 7 Merubah nilai *variabelPointer menjadi 3: var = 3 *variabelPointer = 3

Pointer dan Array

Pointer adalah variabel yang menyimpan alamat variabel lain Pointer tidak hanya dapat menyimpan alamat dari satu variabel, tetapi juga dapat menyimpan alamat dari array. Perhatikan contoh berikut:

Copied!
int *ptr; int arr[5]’ ptr = arr;

Perhatikan kode program diatas, ptr merupakan pointer sedangkan arr merupakan array. Kode program ptr = arr; menyimpan alamat memori elemen pertama array dalam variabel ptr.

Mengarahkan pointer ke setiap elemen array

Misalkan kita perlu menunjuk ke elemen dari array menggunakan pointer yang sama. Sebagai contoh:

ptr + 1 Sama Dengan &arr[1]
ptr + 2 Sama Dengan &arr[2]
ptr + 3 Sama Dengan &arr[3]
ptr + 4 Sama Dengan &arr[4]

Selain itu kita juga bisa mengakses elemen array dengan menggunakan operator dereference
seperti contoh berikut:

*ptr Sama Dengan arr[0]
*(ptr+1) Sama Dengan arr[1]
*(ptr+2) Sama Dengan arr[2]
*(ptr+3) Sama Dengan arr[3]
*(ptr+4) Sama Dengan arr[4]

Contoh 4:

#include <iostream>
using namespace std;
int main()
{
    float arr[3];
    float *ptr;
    cout << "Menampilkan alamat array: " << endl;
    for (int i = 0; i < 3; ++i)
        {
        cout << "&arr[" << i << "] = " << &arr[i] << endl;
        }
    ptr = arr;
    cout<<"\nMenampilkan alamat dengan menggunakan pointer: "<< endl;
    for (int i = 0; i < 3; ++i)
        {
        cout << "ptr + " << i << " = "<< ptr + i << endl;
        }
 return 0;
}

Output :

Copied!
Menampilkan alamat array: &arr[0] = 0x33d13ffaf4 &arr[1] = 0x33d13ffaf8 &arr[2] = 0x33d13ffafc Menampilkan alamat dengan menggunakan pointer: ptr + 0 = 0x33d13ffaf4 ptr + 1 = 0x33d13ffaf8 ptr + 2 = 0x33d13ffafc

Contoh 5:

#include <iostream>
using namespace std;
int main() {
    float arr[5];
    cout << "Masukkan 5 bilangan: ";
    for (int i = 0; i < 5; ++i) {
        cin >> *(arr + i) ;
    }
    cout << "Menampilkan 5 bilangan: " << endl;
    for (int i = 0; i < 5; ++i) {
        cout << *(arr + i) << endl ;
    }
 return 0;
}

Output :

Copied!
Masukkan 5 bilangan: 1 2 3 4 5 Menampilkan 5 bilangan: 1 2 3 4 5

Pointer dan Fungsi

Pada materi fungsi di pertemuan sebelumnya ketika meneruskan argument ke dalam suatu fungsi metode yang digunakan disebut dengan passing by value karena nilai sebenarnya dilewati. Namun, ada cara lain untuk meneruskan argument ke fungsi dimana nilai sebenarnya dari argument tidak diteruskan. Sebagai gantinya, referensi ke nilai dilewati. Sebagai contoh:

Copied!
// fungsi yang mengambil nilai sebagai parameter void func1(int numVal) { // body } // fungsi yang mengambil referensi sebagai parameter // perhatikan & sebelum parameter void func2(int &numRef) { // body } int main() { int num = 5; // passing dengan nilai func1(num); // passing dengan referensi func2(num); return 0; }

Perhatikan kode program di atas, & di dalam parameter fungsi void func2(int &numRef). Ini menunjukkan bahwa kita menggunakan alamat variabel sebagai parameter. Jadi pada saat memanggil fungsi func2 dan meneruskan variabel num sebagai argument, itu sebenarnya kita sedang meneruskan alamat dari variabel num bukan nilai 5.

Contoh 6:

#include <iostream>
using namespace std;

void swap(int &n1, int &n2) {
    int temp;
    temp = n1;
    n1 = n2;
    n2 = temp;
}

int main()
{
    int a = 1, b = 2;
    cout << "Sebelum ditukar" << endl;
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;

    swap(a, b);

    cout << "\nSetelah ditukar" << endl;
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
    
 return 0;
}

Output :

Copied!
Sebelum ditukar a = 1 b = 2 Setelah ditukar a = 2 b = 1

Contoh 7:

#include <iostream>
using namespace std;

void swap(int*, int*);

int main()
{
    int a = 1, b = 2;
    cout << "Sebelum ditukar" << endl;
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
    swap(&a, &b);
    cout << "\nSetelah ditukar" << endl;
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;

 return 0;
}

void swap(int* n1, int* n2) {
    int temp;
    temp = *n1;
    *n1 = *n2;
    *n2 = temp;
}

Output :

Copied!
Sebelum ditukar a = 1 b = 2 Setelah ditukar a = 2 b = 1

Memori Manajemen

Dalam bahasa pemrogram C++ kita dapat mengelola memori secara efektif menggunakan operator new dan delete. C++ memungkinkan kita untuk mengalokasikan memori variabel atau array dalam waktu berjalan ini dikenal dengan alokasi memori dinamis. Dalam bahasa pemrograman yang lain seperti Java atau Python, kompiler secara otomatis mengelola memori yang di alokasikan ke dalam variabel, tetapi di C++ tidak seperti itu. Dalam bahasa pemrograman C++ kita perlu membatalkan alokasi memori yang dialokasikan secara dinamis secara manual setelah kita tidak menggunakan variabel tersebut. Kita dapat mengalokasikan dan kemudian membatalkan alokasi memori secara dinamis menggunakan masing-masing operator new dan delete.

Operator new

Operator ini berfungsi untuk mengalokasikan memori ke variabel. Sebagai contoh:

Copied!
// mendeklarasikan pointer dengan tipe data int int* pointVar; // mengalokasikan memori secara dinamis // menggunakan kata kunci baru pointVar = new int; // tetapkan nilai ke memori yang dialokasikan *pointVar = 45;

Leave a Reply

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