Dalam tutorial ini, anda akan belajar mengenai petunjuk; apa petunjuknya, bagaimana anda menggunakannya dan kesilapan biasa yang mungkin anda hadapi semasa bekerja dengannya dengan bantuan contoh.
Penunjuk adalah ciri kuat pengaturcaraan C dan C ++. Sebelum kita belajar petunjuk, mari kita pelajari alamat dalam pengaturcaraan C.
Alamat di C
Sekiranya anda mempunyai variabel variabel dalam program anda, &var
akan memberikan alamatnya dalam ingatan.
Kami telah menggunakan alamat berkali-kali semasa menggunakan scanf()
fungsi.
scanf("%d", &var);
Di sini, nilai yang dimasukkan oleh pengguna disimpan di alamat pemboleh ubah var. Mari kita ambil contoh yang berfungsi.
#include int main() ( int var = 5; printf("var: %d", var); // Notice the use of & before var printf("address of var: %p", &var); return 0; )
Pengeluaran
var: 5 alamat var: 2686778
Catatan: Anda mungkin akan mendapat alamat yang berbeza semasa anda menjalankan kod di atas.
Penunjuk C
Penunjuk (pemboleh ubah penunjuk) adalah pemboleh ubah khas yang digunakan untuk menyimpan alamat dan bukannya nilai.
Sintaks Pointer
Inilah cara kita dapat menyatakan petunjuk.
int* p;
Di sini, kami telah menyatakan jenis penunjuk int
.
Anda juga boleh menyatakan petunjuk dengan cara ini.
int *p1; int * p2;
Mari kita ambil contoh lain untuk menyatakan petunjuk.
int* p1, p2;
Di sini, kami telah menyatakan penunjuk p1 dan pemboleh ubah normal p2.
Menetapkan alamat kepada Penunjuk
Mari kita ambil contoh.
int* pc, c; c = 5; pc = &c;
Di sini, 5 diberikan kepada pemboleh ubah c. Dan, alamat c ditugaskan ke pointer pc.
Dapatkan Nilai Perkara yang Ditunjuk oleh Penunjuk
Untuk mendapatkan nilai perkara yang ditunjukkan oleh penunjuk, kami menggunakan *
operator. Sebagai contoh:
int* pc, c; c = 5; pc = &c; printf("%d", *pc); // Output: 5
Di sini, alamat c
diberikan kepada pointer pc. Untuk mendapatkan nilai yang tersimpan di alamat itu, kami menggunakan * pc.
Catatan: Dalam contoh di atas, pc adalah penunjuk, bukan *pc
. Anda tidak boleh dan tidak boleh melakukan sesuatu seperti *pc = &c
;
*
Ngomong-ngomong , disebut operator dereference (ketika bekerja dengan pointer). Ia beroperasi pada penunjuk dan memberikan nilai yang tersimpan dalam penunjuk itu.
Menukar Nilai yang Ditunjuk oleh Penunjuk
Mari kita ambil contoh.
int* pc, c; c = 5; pc = &c; c = 1; printf("%d", c); // Output: 1 printf("%d", *pc); // Ouptut: 1
Kami telah memberikan alamat c ke pointer pc.
Kemudian, kami menukar nilai c menjadi 1. Oleh kerana pc dan alamat c adalah sama, *pc
memberi kami 1.
Mari kita ambil contoh lain.
int* pc, c; c = 5; pc = &c; *pc = 1; printf("%d", *pc); // Ouptut: 1 printf("%d", c); // Output: 1
Kami telah memberikan alamat c ke pointer pc.
Kemudian, kami menukar *pc
menjadi 1 menggunakan *pc = 1;
. Oleh kerana pc dan alamat c adalah sama, c akan sama dengan 1.
Mari kita ambil satu lagi contoh.
int* pc, c, d; c = 5; d = -15; pc = &c; printf("%d", *pc); // Output: 5 pc = &d; printf("%d", *pc); // Ouptut: -15
Pada mulanya, alamat c ditugaskan ke pointer pc menggunakan pc = &c;
. Oleh kerana c adalah 5, *pc
memberi kita 5.
Kemudian, alamat d ditugaskan ke penunjuk pc menggunakan pc = &d;
. Oleh kerana d adalah -15, *pc
memberi kita -15.
Contoh: Kerja Penunjuk
Mari kita ambil contoh yang berfungsi.
#include int main() ( int* pc, c; c = 22; printf("Address of c: %p", &c); printf("Value of c: %d", c); // 22 pc = &c; printf("Address of pointer pc: %p", pc); printf("Content of pointer pc: %d", *pc); // 22 c = 11; printf("Address of pointer pc: %p", pc); printf("Content of pointer pc: %d", *pc); // 11 *pc = 2; printf("Address of c: %p", &c); printf("Value of c: %d", c); // 2 return 0; )
Pengeluaran
Alamat c: 2686784 Nilai c: 22 Alamat pc penunjuk: 2686784 Kandungan pc penunjuk: 22 Alamat pc penunjuk: 2686784 Kandungan pc penunjuk: 11 Alamat c: 2686784 Nilai c: 2
Penjelasan program
int* pc, c;
Here, a pointer pc and a normal variable c, both of typeint
, is created.
Since pc and c are not initialized at initially, pointer pc points to either no address or a random address. And, variable c has an address but contains random garbage value.c = 22;
This assigns 22 to the variable c. That is, 22 is stored in the memory location of variable c.pc = &c;
This assigns the address of variable c to the pointer pc.c = 11;
This assigns 11 to variable c.*pc = 2;
This change the value at the memory location pointed by the pointer pc to 2.
Common mistakes when working with pointers
Suppose, you want pointer pc to point to the address of c. Then,
int c, *pc; // pc is address but c is not pc = c; // Error // &c is address but *pc is not *pc = &c; // Error // both &c and pc are addresses pc = &c; // both c and *pc values *pc = c;
Here's an example of pointer syntax beginners often find confusing.
#include int main() ( int c = 5; int *p = &c; printf("%d", *p); // 5 return 0; )
Why didn't we get an error when using int *p = &c;
?
It's because
int *p = &c;
is equivalent to
int *p: p = &c;
Dalam kedua kes tersebut, kami membuat penunjuk p
(bukan *p
) dan memberikannya &c
.
Untuk mengelakkan kekeliruan ini, kita boleh menggunakan pernyataan seperti ini:
int* p = &c;
Sekarang anda tahu apa itu petunjuk, anda akan belajar bagaimana petunjuk berkaitan dengan tatasusunan dalam tutorial seterusnya.