Apa itu Penunjuk?
Dalam C ++, penunjuk merujuk kepada pemboleh ubah yang menyimpan alamat pemboleh ubah lain. Seperti pemboleh ubah biasa, penunjuk mempunyai jenis data. Sebagai contoh, penunjuk bilangan bulat boleh menyimpan alamat pemboleh ubah jenis bilangan bulat. Penunjuk jenis watak boleh menyimpan alamat pemboleh ubah jenis watak.
Anda harus melihat penunjuk sebagai simbolik alamat memori. Dengan petunjuk, program dapat mensimulasikan panggilan demi rujukan. Mereka juga dapat membuat dan memanipulasi struktur data dinamik. Dalam C ++, pemboleh ubah penunjuk merujuk kepada pemboleh ubah yang menunjuk ke alamat tertentu dalam memori yang ditunjukkan oleh pemboleh ubah lain.
Dalam tutorial C ++ ini, anda akan belajar:
- Apa itu Penunjuk?
- Alamat di C ++
- Sintaksis Pernyataan Penunjuk
- Operator rujukan (&) dan operator Deference (*)
- Petunjuk dan Susunan
- Penunjuk NULL
- Petunjuk Pemboleh ubah
- Aplikasi Penunjuk
- Kelebihan menggunakan Penunjuk
Alamat di C ++
Untuk memahami petunjuk C ++, anda mesti memahami bagaimana komputer menyimpan data.
Apabila anda membuat pemboleh ubah dalam program C ++ anda, ia diberikan sedikit ruang memori komputer. Nilai pemboleh ubah ini disimpan di lokasi yang ditetapkan.
Untuk mengetahui lokasi dalam memori komputer di mana data disimpan, C ++ menyediakan pengendali & (rujukan). Pengendali mengembalikan alamat yang diduduki oleh pemboleh ubah.
Contohnya, jika x adalah pemboleh ubah, & x mengembalikan alamat pemboleh ubah.
Sintaksis Pernyataan Penunjuk
Pengisytiharan C ++ mengambil sintaks berikut:
datatype *variable_name;
- Jenis data adalah jenis asas penunjuk yang mestilah jenis data C ++ yang sah.
- Nama_pemboleh ubah mestilah nama pemboleh ubah penunjuk.
- Asterisk yang digunakan di atas untuk penunjuk pointer sama dengan asterisk yang digunakan untuk melakukan operasi pendaraban. Tanda bintang yang menandakan pemboleh ubah sebagai penunjuk.
Berikut adalah contoh pernyataan penunjuk yang sah di C ++:
int *x; // a pointer to integerdouble *x; // a pointer to doublefloat *x; // a pointer to floatchar *ch // a pointer to a character
Operator rujukan (&) dan operator Deference (*)
Operator rujukan (&) mengembalikan alamat pemboleh ubah.
Operator dereference (*) membantu kami mendapatkan nilai yang telah disimpan di alamat memori.
Sebagai contoh:
Sekiranya kita mempunyai pembolehubah yang diberi nama num, disimpan di alamat 0x234 dan menyimpan nilainya 28.
Operator rujukan (&) akan mengembalikan 0x234.
Operator dereference (*) akan mengembalikan 5.
Contoh 1:
#includeusing namespace std;int main() {int x = 27;int *ip;ip = &x;cout << "Value of x is : ";cout << x << endl;cout << "Value of ip is : ";cout << ip<< endl;cout << "Value of *ip is : ";cout << *ip << endl;return 0;}
Pengeluaran:
Cara ini berfungsi:
Berikut adalah tangkapan skrin kod:
Penjelasan Kod:
- Import fail tajuk iostream. Ini akan membolehkan kita menggunakan fungsi yang ditentukan dalam fail tajuk tanpa mendapat ralat.
- Sertakan ruang nama std untuk menggunakan kelasnya tanpa memanggilnya.
- Panggil fungsi utama (). Logik program harus ditambahkan dalam badan fungsi ini. {Menandakan permulaan badan fungsi.
- Menyatakan pemboleh ubah integer x dan memberikannya nilai 27.
- Menyatakan pemboleh ubah penunjuk * ip.
- Simpan alamat pemboleh ubah x dalam pemboleh ubah penunjuk.
- Cetak sebilangan teks pada konsol.
- Cetak nilai pemboleh ubah x di skrin.
- Cetak sebilangan teks pada konsol.
- Cetak alamat pemboleh ubah x. Nilai alamat disimpan dalam pemboleh ubah ip.
- Cetak sebilangan teks pada konsol.
- Nilai cetak disimpan di alamat penunjuk.
- Program harus mengembalikan nilai apabila berjaya dilaksanakan.
- Akhir badan utama () fungsi.
Petunjuk dan Susunan
Susunan dan penunjuk berfungsi berdasarkan konsep yang berkaitan. Terdapat pelbagai perkara yang perlu diperhatikan ketika bekerja dengan tatasusunan yang mempunyai petunjuk. Nama array itu sendiri menunjukkan alamat asas array. Ini bermaksud bahawa untuk menetapkan alamat array ke penunjuk, anda tidak boleh menggunakan ampersand (&).
Sebagai contoh:
p = arr;
Di atas betul kerana arr mewakili alamat array. Berikut adalah contoh lain:
p = &arr;
Perkara di atas tidak betul.
Kita secara implisit dapat menukar array menjadi penunjuk. Sebagai contoh:
int arr [20];int * ip;
Berikut adalah operasi yang sah:
ip = arr;
Selepas pengisytiharan di atas, ip dan arr akan setara, dan mereka akan berkongsi harta. Walau bagaimanapun, alamat yang berbeza dapat diberikan ke ip, tetapi kami tidak dapat memberikan apa-apa kepada arr.
Contoh 2:
Contoh ini menunjukkan cara melintasi array menggunakan pointer:
#includeusing namespace std;int main() {int *ip;int arr[] = { 10, 34, 13, 76, 5, 46 };ip = arr;for (int x = 0; x < 6; x++) {cout << *ip << endl;ip++;}return 0;}
Pengeluaran:
Berikut adalah tangkapan skrin kod:
Penjelasan Kod:
- Menyatakan ip pemboleh ubah integer.
- Menyatakan array yang bernama arr dan menyimpan 6 bilangan bulat ke dalamnya.
- Tugaskan arr ke ip. Ip dan arr akan menjadi setara.
- Buat a untuk gelung. Pemboleh ubah gelung x dibuat untuk melancarkan elemen array dari indeks 0 hingga 5.
- Cetak nilai yang disimpan di alamat IP penunjuk. Satu nilai akan dikembalikan setiap lelaran, dan sebanyak 6 pengulangan akan dilakukan. Endl adalah kata kunci C ++ yang bermaksud garis akhir. Tindakan ini membolehkan anda menggerakkan kursor ke baris seterusnya setelah setiap nilai dicetak. Setiap nilai akan dicetak dalam satu baris.
- Untuk memindahkan penunjuk ke kedudukan int seterusnya selepas setiap lelaran.
- Akhir untuk gelung.
- Program mesti mengembalikan sesuatu setelah berjaya dilaksanakan.
- Akhir badan fungsi utama ().
Penunjuk NULL
Sekiranya tidak ada alamat tepat yang akan diberikan, maka pemboleh ubah penunjuk dapat diberikan NULL. Ia harus dilakukan semasa pengisytiharan. Penunjuk seperti itu dikenali sebagai penunjuk nol. Nilainya adalah sifar dan ditentukan di banyak pustaka standard seperti iostream.
Contoh 3:
#includeusing namespace std;int main() {int *ip = NULL;cout << "Value of ip is: " << ip;return 0;}
Pengeluaran:
Berikut adalah tangkapan skrin kod:
Penjelasan Kod:
- Menyatakan ip pemboleh ubah penunjuk dan memberikannya nilai NULL.
- Nilai cetak ip pemboleh ubah pointer di samping beberapa teks pada konsol.
- Program mesti mengembalikan nilai setelah berjaya diselesaikan.
- Akhir badan utama () fungsi.
Petunjuk Pemboleh ubah
Dengan C ++, anda dapat memanipulasi data secara langsung dari memori komputer.
Ruang memori boleh ditugaskan atau ditugaskan semula mengikut kehendak. Ini dimungkinkan oleh pemboleh ubah Pointer.
Pemboleh ubah penunjuk menunjukkan alamat tertentu dalam memori komputer yang ditunjukkan oleh pemboleh ubah lain.
Ia boleh dinyatakan sebagai berikut:
int *p;
Atau,
int* p;
Dalam contoh anda, kami telah menyatakan pemboleh ubah penunjuk p.
Ia akan menyimpan alamat memori.
Tanda bintang adalah pengendali penghindaran yang bermaksud penunjuk ke.
Penunjuk p menunjukkan nilai integer dalam alamat memori.
Contoh 4:
#includeusing namespace std;int main() {int *p, x = 30;p = &x;cout << "Value of x is: " << *p;return 0;}
Pengeluaran:
Berikut adalah tangkapan skrin kod:
Penjelasan Kod:
- Menyatakan pemboleh ubah penunjuk p dan pemboleh ubah x dengan nilai 30.
- Tetapkan alamat pemboleh ubah x hingga p.
- Cetak nilai pemboleh ubah penunjuk p di samping beberapa teks pada konsol.
- Program mesti mengembalikan nilai setelah berjaya diselesaikan.
- Akhir badan utama () fungsi.
Aplikasi Penunjuk
Fungsi dalam C ++ hanya dapat mengembalikan satu nilai. Selanjutnya, semua pemboleh ubah yang dinyatakan dalam fungsi dialokasikan pada stack panggilan fungsi. Sebaik sahaja fungsi kembali, semua pemboleh ubah timbunan dihancurkan.
Hujah untuk berfungsi diteruskan oleh nilai, dan setiap pengubahsuaian yang dilakukan pada pemboleh ubah tidak mengubah nilai pemboleh ubah sebenarnya yang dilalui. Contoh berikut membantu menggambarkan konsep ini: -
Contoh 5:
#includeusing namespace std;void test(int*, int*);int main() {int a = 5, b = 5;cout << "Before changing: << endl;cout << "a = " << a << endl;cout << "b = " << b << endl;test(&a, &b);cout << "\nAfter changing" << endl;cout << "a = " << a << endl;cout << "b = " << b << endl;return 0;}void test(int* n1, int* n2) {*n1 = 10;*n2 = 11;}
Pengeluaran:
Berikut adalah tangkapan skrin kod:
Penjelasan Kod:
- Buat prototaip fungsi bernama ujian yang akan mengambil dua parameter integer.
- Panggil fungsi utama (). Kami akan menambahkan logik program di dalam badannya.
- Menyatakan dua pemboleh ubah integer a dan b, masing-masing dengan nilai 5.
- Cetak sebilangan teks pada konsol. Endl (garisan akhir) akan menggerakkan kursor untuk mula mencetak pada baris seterusnya.
- Cetak nilai pemboleh ubah a pada konsol bersama teks lain. Endl (garisan akhir) akan menggerakkan kursor untuk mula mencetak pada baris seterusnya.
- Cetak nilai pemboleh ubah b di konsol bersama teks lain. Endl (garisan akhir) akan menggerakkan kursor untuk mula mencetak pada baris seterusnya.
- Buat fungsi bernama test () yang mengambil alamat pemboleh ubah a dan b sebagai parameter.
- Cetak sebilangan teks pada konsol. \ N akan membuat baris kosong baru sebelum teks dicetak. Endl (garisan akhir) akan menggerakkan kursor untuk mula mencetak pada baris seterusnya setelah teks dicetak.
- Cetak nilai pemboleh ubah a pada konsol bersama teks lain. Endl (garisan akhir) akan menggerakkan kursor untuk mula mencetak pada baris seterusnya.
- Cetak nilai pemboleh ubah b di konsol bersama teks lain. Endl (garisan akhir) akan menggerakkan kursor untuk mula mencetak pada baris seterusnya.
- Program mesti mengembalikan nilai setelah berjaya diselesaikan.
- Akhir badan utama () fungsi.
- Mendefinisikan ujian fungsi (). Fungsi harus mengambil dua pemboleh ubah penunjuk integer * n1 dan * n2.
- Menetapkan pemboleh ubah penunjuk * n1 nilai 10.
- Menetapkan pemboleh ubah penunjuk * n2 nilai 11.
- Akhir badan ujian fungsi ().
Walaupun, nilai baru ditugaskan untuk pemboleh ubah a dan b dalam uji fungsi, setelah panggilan fungsi selesai, hal yang sama tidak tercermin fungsi utama luar.
Menggunakan penunjuk sebagai argumen fungsi membantu menyampaikan alamat sebenar pemboleh ubah dalam fungsi, dan semua perubahan yang dilakukan pada pemboleh ubah akan tercermin dalam fungsi luar.
Dalam kes di atas, fungsi 'test' mempunyai alamat pemboleh ubah 'a' dan 'b.' Kedua pemboleh ubah ini dapat diakses secara langsung dari fungsi 'test', dan oleh itu setiap perubahan yang dilakukan terhadap pemboleh ubah ini tercermin dalam fungsi pemanggil 'utama.'
Kelebihan menggunakan Penunjuk
Berikut adalah kebaikan / faedah menggunakan Pointers
- Penunjuk adalah pemboleh ubah yang menyimpan alamat pemboleh ubah lain dalam C ++.
- Lebih daripada satu pemboleh ubah dapat diubah dan dikembalikan oleh fungsi menggunakan pointer.
- Memori dapat dialokasikan secara dinamik dan dibahagikan menggunakan penunjuk.
- Petunjuk membantu dalam mempermudah kerumitan program.
- Kelajuan pelaksanaan program bertambah baik dengan menggunakan petunjuk.
Ringkasan:
- Penunjuk merujuk kepada alamat pemboleh ubah pemboleh ubah lain.
- Setiap penunjuk mempunyai jenis data yang sah.
- Penunjuk adalah representasi simbolik dari alamat memori.
- Penunjuk membolehkan program mensimulasikan panggilan demi rujukan dan membuat dan memanipulasi struktur data dinamik.
- Susunan dan penunjuk menggunakan konsep yang berkaitan.
- Nama array menunjukkan asas array.
- Sekiranya anda ingin menetapkan alamat array ke penunjuk, jangan gunakan ampersand (&).
- Sekiranya tidak ada alamat khusus untuk menetapkan pemboleh ubah penunjuk, berikan NULL.