C++

Cara menggunakan C++ Pointer

Cara menggunakan C++ Pointer
Memori komputer adalah rangkaian sel yang panjang. Ukuran setiap sel disebut byte. Byte adalah ruang yang ditempati oleh karakter alfabet bahasa Inggris. Objek dalam pengertian biasa adalah kumpulan byte berurutan dalam memori. Setiap sel memiliki alamat, yang merupakan bilangan bulat, biasanya ditulis dalam bentuk heksadesimal. Ada tiga cara mengakses objek dalam memori. Sebuah objek dapat diakses menggunakan apa yang dikenal sebagai pointer. Itu dapat diakses menggunakan apa yang dikenal sebagai referensi. Itu masih dapat diakses menggunakan pengenal. Fokus artikel ini adalah pada penggunaan pointer dan referensi reference. Di C++, ada objek runcing dan objek pointer. Objek runcing memiliki objek yang menarik. Objek pointer memiliki alamat ke objek yang ditunjuk.

Anda harus memiliki pengetahuan dasar dalam C++, termasuk pengidentifikasi, fungsi, dan arraynya; untuk memahami artikel ini.

Objek penunjuk dan objek runcing, masing-masing memiliki pengenalnya.

Alamat-Operator, &

Ini adalah operator unary. Ketika diikuti oleh pengidentifikasi, ia mengembalikan alamat objek pengidentifikasi. Perhatikan deklarasi berikut:

int ptdInt;

Di bawah ini adalah kode, ekspresi berikut, akan mengembalikan alamat yang diidentifikasi oleh ptdInt:

&ptdInt

Anda tidak perlu mengetahui alamat (nomor) yang tepat seperti yang Anda kode.

Operator Indirection, *

Ini adalah operator unary dalam konteks pointer. Biasanya diketik di depan pengenal. Jika digunakan dalam deklarasi pengidentifikasi, maka pengidentifikasi adalah objek penunjuk yang hanya menyimpan alamat objek yang ditunjuk. Jika digunakan di depan pengidentifikasi objek penunjuk, untuk mengembalikan sesuatu, maka benda yang dikembalikan adalah nilai objek runcing.

Membuat Penunjuk

Perhatikan segmen kode berikut:

mengambang ptdFloat;
mengapung *ptrMengambang;
ptrFoat = &ptdFloat;

Segmen dimulai dengan deklarasi objek runcing, ptdFloat. ptdFloat adalah pengidentifikasi, yang hanya mengidentifikasi objek float. Objek (nilai) sebenarnya dapat ditetapkan untuknya, tetapi dalam kasus ini, tidak ada yang ditetapkan padanya. Selanjutnya di segmen, ada deklarasi objek pointer. Operator tipuan di depan pengidentifikasi ini berarti ia harus menyimpan alamat objek runcing. Jenis objek, float di awal pernyataan, berarti objek runcing adalah float. Objek penunjuk selalu bertipe sama dengan objek runcing. ptrFoat adalah pengidentifikasi, yang hanya mengidentifikasi objek penunjuk.

Dalam pernyataan terakhir dari kode, alamat dari objek menunjuk ditugaskan ke objek penunjuk pointer. Perhatikan penggunaan alamat-operator, &.

Pernyataan (baris) terakhir di atas menunjukkan, bahwa setelah mendeklarasikan objek pointer tanpa inisialisasi, Anda tidak memerlukan operator tipuan, ketika Anda harus menginisialisasinya. Sebenarnya, ini adalah kesalahan sintaks untuk menggunakan operator tipuan di baris ketiga (terakhir).

Objek penunjuk dapat dideklarasikan dan diinisialisasi oleh objek penunjuk dalam satu pernyataan, sebagai berikut:

mengapung ptdFloat;
float *ptrFoat = &ptdFloat;

Baris pertama dari segmen kode sebelumnya dan yang ini, adalah sama. Baris kedua dan ketiga dari segmen kode sebelumnya telah digabungkan menjadi satu pernyataan di sini.

Perhatikan dalam kode di atas bahwa ketika mendeklarasikan dan menginisialisasi objek pointer, operator tipuan harus digunakan. Namun, itu tidak digunakan jika inisialisasi harus dilakukan sesudahnya. Objek pointer diinisialisasi dengan alamat objek menunjuk.

Di segmen kode berikut, operator tipuan digunakan untuk mengembalikan konten objek runcing.

int ptdInt = 5;
int *ptrInt = &ptdInt;
cout << *ptrInt << '\n';

Outputnya adalah 5.

Dalam pernyataan terakhir di sini, operator tipuan telah digunakan untuk mengembalikan nilai yang ditunjuk, oleh pengidentifikasi pointer. Jadi, ketika digunakan dalam deklarasi, pengidentifikasi untuk operator tipuan akan menyimpan alamat objek yang ditunjuk pointed. Ketika digunakan dalam ekspresi pengembalian, dalam kombinasi dengan pengidentifikasi pointer, operator tipuan mengembalikan nilai objek yang ditunjuk.

Menetapkan Nol ke Pointer

Objek penunjuk harus selalu memiliki tipe objek runcing. Saat mendeklarasikan objek penunjuk, tipe data objek runcing harus digunakan. Namun, nilai nol desimal dapat ditetapkan ke penunjuk seperti pada segmen kode berikut:

int ptdInt = 5;
int *ptrInt;
ptrInt = 0;
atau di segmen,
int ptdInt = 5;
int *ptrInt = 0;

Dalam kedua kasus, pointer (pengidentifikasi) disebut pointer nol; artinya, itu menunjuk ke mana-mana. Artinya, ia tidak memiliki alamat objek runcing apa pun. Di sini, 0 adalah nol desimal dan bukan nol heksadesimal. Nol heksadesimal akan menunjuk ke alamat pertama dari memori komputer.

Jangan mencoba untuk mendapatkan nilai yang ditunjuk oleh pointer nol. Jika Anda mencobanya, program dapat dikompilasi, tetapi tidak dapat dijalankan.

Nama Array sebagai Penunjuk Konstan

Perhatikan larik berikut:

int arr[] = 000, 100, 200, 300, 400;

Nama array, arr sebenarnya adalah pengidentifikasi yang memiliki alamat elemen pertama array. Ekspresi berikut mengembalikan nilai pertama dalam array:

*arr

Dengan array, operator kenaikan, ++ berperilaku berbeda. Alih-alih menambahkan 1, itu menggantikan alamat pointer, dengan alamat elemen berikutnya dalam array. Namun, nama array adalah pointer konstan; artinya isinya (alamat) tidak dapat diubah atau ditambah. Jadi, untuk menambah, alamat awal array harus ditetapkan ke pointer non-konstan sebagai berikut:

int *ptr = arr;

Sekarang, ptr dapat ditambahkan untuk menunjuk ke elemen array berikutnya. ptr telah dideklarasikan di sini sebagai objek pointer. Tanpa * di sini, itu tidak akan menjadi pointer; itu akan menjadi pengidentifikasi untuk menampung objek int dan bukan untuk menyimpan alamat memori.

Segmen kode berikut akhirnya menunjuk ke elemen keempat:

++PT;
++PT;
++PT;

Kode berikut menampilkan nilai keempat dari array:

int arr[] = 000, 100, 200, 300, 400;
int *ptr = arr;
++PT;
++PT;
++PT;
cout << *ptr << '\n';

Outputnya adalah 300.

Nama Fungsi sebagai Pengenal

Nama suatu fungsi adalah pengidentifikasi dari fungsi tersebut. Perhatikan definisi fungsi berikut:

int fn()

cout << "seen" << '\n';
kembali 4;

fn adalah pengidentifikasi fungsi. Ekspresi,

&fn

mengembalikan alamat fungsi dalam memori. fn seperti benda runcing. Deklarasi berikut mendeklarasikan pointer ke suatu fungsi:

int (*fungsi)();

Pengidentifikasi untuk objek runcing dan pengidentifikasi untuk objek penunjuk berbeda. func adalah penunjuk ke suatu fungsi. fn adalah pengidentifikasi fungsi. Jadi, func dapat dibuat untuk menunjuk ke fn sebagai berikut:

fungsi = &fn;

Nilai (isi) dari func adalah alamat dari fn. Kedua pengidentifikasi dapat dihubungkan dengan pernyataan inisialisasi sebagai berikut:

int (*fungsi)() = &fn;

Perhatikan perbedaan dan persamaan dalam menangani pointer fungsi dan pointer skalar. func adalah penunjuk ke suatu fungsi; itu adalah objek runcing; itu dideklarasikan berbeda dari penunjuk skalar.

Fungsi tersebut dapat dipanggil dengan,

fn()
atau
fungsi()

Itu tidak bisa dipanggil dengan * func().

Ketika fungsi memiliki parameter, tanda kurung kedua memiliki jenis parameter dan tidak perlu memiliki pengidentifikasi untuk parameter. Program berikut menggambarkan hal ini:

#termasuk
menggunakan namespace std;
float fn(float fl, int in)

kembali fl;

int utama()

float (*fungsi)(float, int) = &fn;
float val = fungsi(2.5, 6);
cout << val << '\n';
kembali 0;

Keluarannya adalah 2.5.

Referensi C++

Referensi dalam C++ hanyalah cara untuk menghasilkan sinonim (nama lain) untuk pengidentifikasi. Ini menggunakan operator &, tetapi tidak dengan cara yang sama seperti & digunakan untuk pointer. Perhatikan segmen kode berikut:

int myInt = 8;
int &yourInt = myInt;
cout << myInt << '\n';
cout << yourInt << '\n';

Outputnya adalah:

8
8

Pernyataan pertama menginisialisasi pengenal, myInt; saya.e. myInt dideklarasikan dan dibuat untuk menampung nilai, 8. Pernyataan kedua membuat pengenal baru, yourInt sinonim dengan myInt. Untuk mencapai ini, operator & ditempatkan di antara tipe data dan pengidentifikasi baru dalam deklarasi. Pernyataan cout menunjukkan bahwa kedua pengidentifikasi adalah sinonim. Untuk mengembalikan nilai dalam hal ini, Anda tidak perlu mengawalinya dengan * . Cukup gunakan pengidentifikasi.

myInt dan yourInt di sini, bukanlah dua objek yang berbeda. Mereka adalah dua pengidentifikasi berbeda yang merujuk (mengidentifikasi) lokasi yang sama di memori yang memiliki nilai, 8. Jika nilai myInt diubah, nilai yourInt juga akan berubah secara otomatis. Jika nilai yourInt diubah, nilai myInt juga akan berubah secara otomatis.

Referensi memiliki jenis yang sama.

Referensi ke Fungsi

Sama seperti Anda dapat memiliki referensi ke skalar, Anda juga dapat memiliki referensi ke suatu fungsi. Namun, pengkodean referensi ke fungsi berbeda dari pengkodean referensi ke skalar. Program berikut menggambarkan hal ini:

#termasuk
menggunakan namespace std;
float fn(float fl, int in)

kembali fl;

int utama()

float (&fungsi)(float, int) = fn;
float val = fungsi(2.5, 6);
cout << val << '\n';
kembali 0;

Keluarannya adalah 2.5.

Perhatikan pernyataan pertama dalam fungsi utama, yang membuat fungsi menjadi sinonim dari fn. Keduanya merujuk fungsi yang sama. Perhatikan penggunaan tunggal dan posisi &. Jadi & adalah operator referensi di sini dan bukan alamat-operator. Untuk memanggil fungsi, cukup gunakan salah satu nama.

Pengidentifikasi referensi tidak sama dengan pengidentifikasi pointer.

Fungsi mengembalikan Pointer

Dalam program berikut, fungsi mengembalikan pointer, yang merupakan alamat dari objek yang ditunjuk:

#termasuk
menggunakan namespace std;
float *fn(float fl, int in)

mengapung *fll = &fl;
kembali fll;

int utama()

float *val = fn(2.5, 6);
cout << *val << '\n';
kembali 0;

Keluarannya adalah 2.5

Pernyataan pertama dalam fungsi, fn() ada hanya untuk membuat objek pointer. Perhatikan penggunaan tunggal dan posisi * dalam tanda tangan fungsi. Perhatikan juga bagaimana pointer (alamat), diterima dalam fungsi main() oleh objek pointer lain.

Fungsi mengembalikan Referensi

Dalam program berikut, fungsi mengembalikan referensi:

#termasuk
menggunakan namespace std;
float &fn(float fl, int in)

mengapung &frr = fl;
kembali fr;

int utama()

float &val = fn(2.5, 6);
cout << val << '\n';
kembali 0;

Keluarannya adalah 2.5.

Pernyataan pertama dalam fungsi, fn() ada hanya untuk membuat referensi. Perhatikan penggunaan tunggal dan posisi & dalam tanda tangan fungsi. Perhatikan juga bagaimana referensi, diterima di fungsi main() oleh referensi lain.

Melewati Pointer ke Fungsi

Dalam program berikut, sebuah pointer, yang sebenarnya adalah alamat dari objek yang menunjuk float, dikirim sebagai argumen ke fungsi:

#termasuk
menggunakan namespace std;
float fn(float *fl, int in)

kembali *fl;

int utama()

mengapung v = 2.5;
float val = fn(&v, 6);
cout << val << '\n';
kembali 0;

Keluarannya adalah 2.5

Perhatikan penggunaan dan posisi * untuk parameter float di tanda tangan fungsi. Segera setelah evaluasi fungsi fn() dimulai, pernyataan berikut dibuat:

mengapung *fl = &v;

Baik fl dan &v menunjuk ke objek runcing yang sama yang memegang 2.5. *fl pada pernyataan pengembalian bukan pernyataan; artinya, nilai dari objek yang ditunjuk oleh objek pointer.

Melewati Referensi ke Fungsi

Dalam program berikut, referensi dikirim sebagai argumen ke fungsi:

#termasuk
menggunakan namespace std;
float fn(float &fl, int in)

kembali fl;

int utama()

mengapung v = 2.5;
float val = fn(v, 6);
cout << val << '\n';
kembali 0;

Keluarannya adalah 2.5

Perhatikan penggunaan dan posisi & untuk parameter float di tanda tangan fungsi. Segera setelah evaluasi fungsi fn() dimulai, pernyataan berikut dibuat:

mengapung &fl = v;

Melewati Array ke Fungsi

Program berikut menunjukkan cara meneruskan array ke suatu fungsi:

#termasuk
menggunakan namespace std;
int fn(int arra[])

kembali arra [2];

int utama()

int arr[] = 000, 100, 200, 300, 400;
int nilai = fn(arr);
cout << val << '\n';
kembali 0;

Outputnya adalah 200.

Dalam program ini, array yang dilewatkan. Perhatikan bahwa parameter tanda tangan fungsi memiliki deklarasi array kosong. Argumen dalam pemanggilan fungsi hanyalah nama dari array yang dibuat.

Bisakah Fungsi C++ mengembalikan Array?

Fungsi dalam C++ dapat mengembalikan nilai array, tetapi tidak dapat mengembalikan array. Kompilasi program berikut menghasilkan pesan kesalahan:

#termasuk
menggunakan namespace std;
int fn(int arra[])

kembali arra;

int utama()

int arr[] = 000, 100, 200, 300, 400;
int nilai = fn(arr);
kembali 0;

Penunjuk Sebuah Penunjuk

Sebuah pointer dapat menunjuk ke pointer lain. Artinya, objek pointer dapat memiliki alamat objek pointer lain. Mereka semua masih harus dari tipe yang sama. Segmen kode berikut menggambarkan hal ini:

int ptdInt = 5;
int *ptrInt = &ptdInt;
int **ptrptrInt = &ptrInt;
cout << **ptrptrInt << '\n';

Outputnya adalah 5.

Dalam deklarasi pointer-to-pointer, double * digunakan. Untuk mengembalikan nilai objek runcing terakhir, double * masih digunakan.

Array Pointer

Program berikut menunjukkan cara membuat kode array pointer:

#termasuk
menggunakan namespace std;
int utama()

int angka0=000, angka1=100, angka2=200, angka3=300, angka4=400;
int *no0=&num0, *no1=&num1, *no2=&num2, *no3=&num3, *no4=&num4;
int *arr[] = no0, no1, no2, no3, no4;
cout << *arr[4] << '\n';
kembali 0;

Outputnya adalah:

400

Perhatikan penggunaan dan posisi * dalam deklarasi array. Perhatikan penggunaan * saat mengembalikan nilai dalam array. Dengan pointer dari pointer, dua * terlibat. Dalam hal array pointer, satu * telah diurus, karena pengidentifikasi array adalah pointer.

Array String Panjang Variabel

String literal adalah konstanta yang mengembalikan pointer. Array string dengan panjang variabel adalah array pointer. Setiap nilai dalam array adalah pointer. Pointer adalah alamat ke lokasi memori dan berukuran sama. String dengan panjang yang berbeda ada di tempat lain di memori, bukan di array. Program berikut mengilustrasikan penggunaannya:

#termasuk
menggunakan namespace std;
int utama()

const char *arr[] = "perempuan", "laki-laki", "perempuan", "dewasa";
cout << arr[2] << '\n';
kembali 0;

Outputnya adalah "gadis".

Deklarasi array dimulai dengan kata yang dicadangkan, "const" untuk konstan; diikuti oleh "char" untuk karakter, lalu tanda bintang, * untuk menunjukkan bahwa setiap elemen adalah pointer. Untuk mengembalikan string dari array, * tidak digunakan, karena sifat implisit dari pointer setiap string. Jika * digunakan, maka elemen pertama dari string akan dikembalikan.

Pointer ke Fungsi mengembalikan Pointer

Program berikut mengilustrasikan bagaimana pointer ke fungsi yang mengembalikan pointer dikodekan:

#termasuk
menggunakan namespace std;
int *fn()

int bilangan = 4;
int *inter = #
kembali antar;

int utama()

int *(*fungsi)() = &fn;
int val = *fungsi();
cout << val << '\n';
kembali 0;

Keluarannya adalah 4.

Deklarasi pointer ke fungsi yang mengembalikan pointer mirip dengan deklarasi pointer ke fungsi biasa tetapi didahului dengan tanda bintang. Pernyataan pertama dalam fungsi main() mengilustrasikan ini. Untuk memanggil fungsi menggunakan pointer, awali dengan *.

Kesimpulan

Untuk membuat pointer ke skalar, lakukan sesuatu seperti,

mengambang menunjuk;
float *penunjuk = &pointed;

* memiliki dua arti: dalam deklarasi, itu menunjukkan pointer; untuk mengembalikan sesuatu, itu untuk nilai benda runcing.

Nama array adalah penunjuk konstan ke elemen pertama array.

Untuk membuat pointer ke suatu fungsi, Anda dapat melakukan,

int (*fungsi)() = &fn;

di mana fn() adalah fungsi yang didefinisikan di tempat lain dan func adalah pointer.

& memiliki dua arti: dalam deklarasi, ini menunjukkan referensi (sinonim) ke objek yang sama sebagai pengenal lain; ketika mengembalikan sesuatu, itu berarti alamat-dari.

Untuk membuat referensi ke suatu fungsi, Anda dapat melakukan,

float (&refFunc)(float, int) = fn;

di mana fn() adalah fungsi yang didefinisikan di tempat lain dan refFunc adalah referensi.

Ketika suatu fungsi mengembalikan pointer, nilai yang dikembalikan harus diterima oleh pointer. Ketika suatu fungsi mengembalikan referensi, nilai yang dikembalikan harus diterima oleh referensi.

Saat meneruskan pointer ke suatu fungsi, parameternya adalah deklarasi, sedangkan argumennya adalah alamat dari objek runcing. Saat meneruskan referensi ke suatu fungsi, parameternya adalah deklarasi, sedangkan argumennya adalah referensinya.

Saat meneruskan array ke suatu fungsi, parameternya adalah deklarasi sedangkan argumennya adalah nama array tanpa []. Fungsi C++ tidak mengembalikan array.

Pointer-to-pointer membutuhkan dua * alih-alih satu, jika sesuai.

Chrys

Instal Game Strategi OpenRA terbaru di Ubuntu Linux
OpenRA adalah mesin game Strategi Waktu Nyata Libre/Gratis yang membuat ulang game Westwood awal seperti Command & Conquer klasik: Red Alert. Mod yang...
Instal Dolphin Emulator terbaru untuk Gamecube & Wii di Linux
Dolphin Emulator memungkinkan Anda memainkan game Gamecube & Wii pilihan Anda di Komputer Pribadi (PC) Linux. Menjadi emulator game sumber terbuka da...
Cara Menggunakan Cheat Engine GameConqueror di Linux
Artikel ini mencakup panduan tentang menggunakan mesin cheat GameConqueror di Linux. Banyak pengguna yang bermain game di Windows sering menggunakan a...