C penunjuk
Pelajari petunjuk dalam C adalah mudah dan menyeronokkan. Penunjuk memudahkan pelaksanaan beberapa tugas pengaturcaraan C, dan beberapa tugas, seperti peruntukan memori dinamik, tidak boleh dilakukan tanpa penunjuk. Oleh itu, jika anda ingin menjadi pengaturcara C yang cemerlang, anda perlu mempelajari petunjuk.
Seperti yang anda ketahui, setiap pembolehubah mempunyai lokasi memori, dan setiap lokasi memori mentakrifkan alamat yang boleh diakses menggunakan pengendali sempang (&), yang mewakili alamat dalam memori . Sila lihat contoh berikut, yang akan mengeluarkan alamat pembolehubah yang ditakrifkan:
#include <stdio.h>int main (){ int var1; char var2[10]; printf("var1 变量的地址: %x\n", &var1 ); printf("var2 变量的地址: %x\n", &var2 ); return 0;}
Apabila kod di atas disusun dan dilaksanakan, ia akan menghasilkan keputusan berikut:
var1 变量的地址: bff5a400 var2 变量的地址: bff5a3f6
Melalui contoh di atas, kita Belajar apa itu alamat memori dan cara mengaksesnya. Seterusnya mari kita lihat apakah petunjuk itu.
Apakah itu penunjuk?
Penunjuk ialah pembolehubah yang nilainya ialah alamat pembolehubah lain, iaitu, alamat langsung lokasi memori. Sama seperti mana-mana pembolehubah atau pemalar lain, anda mesti mengisytiharkan penunjuk sebelum menggunakannya untuk menyimpan alamat pembolehubah lain. Bentuk umum pengisytiharan pembolehubah penunjuk ialah:
type *var-name;
Di sini, jenis ialah jenis asas penuding, yang mestilah jenis data C yang sah, nama-var ialah nama pembolehubah penunjuk. Asterisk * yang digunakan untuk mengisytiharkan penunjuk adalah sama seperti yang digunakan dalam pendaraban. Walau bagaimanapun, dalam pernyataan ini, asterisk digunakan untuk menentukan bahawa pembolehubah ialah penunjuk. Berikut ialah pengisytiharan penunjuk yang sah:
int *ip; /* 一个整型的指针 */double *dp; /* 一个 double 型的指针 */float *fp; /* 一个浮点型的指针 */char *ch /* 一个字符型的指针 */
Jenis data sebenar semua nilai penunjuk, sama ada integer, titik terapung, aksara atau jenis data lain, adalah sama dan mewakili nombor heksadesimal panjang alamat memori yang sama . Satu-satunya perbezaan antara penunjuk jenis data yang berbeza ialah jenis data pembolehubah atau pemalar yang ditunjuk oleh penunjuk.
Bagaimana untuk menggunakan penunjuk?
Apabila menggunakan penunjuk, operasi berikut kerap dilakukan: mentakrifkan pembolehubah penunjuk, memberikan alamat pembolehubah kepada penuding dan mengakses nilai alamat yang tersedia dalam pembolehubah penunjuk. Ini dilakukan dengan menggunakan operator unary * untuk mengembalikan nilai pembolehubah yang terletak pada alamat yang ditentukan oleh operan. Contoh berikut melibatkan operasi ini:
#include <stdio.h>int main (){ int var = 20; /* 实际变量的声明 */ int *ip; /* 指针变量的声明 */ ip = &var; /* 在指针变量中存储 var 的地址 */ printf("Address of var variable: %x\n", &var ); /* 在指针变量中存储的地址 */ printf("Address stored in ip variable: %x\n", ip ); /* 使用指针访问值 */ printf("Value of *ip variable: %d\n", *ip ); return 0;}
Apabila kod di atas disusun dan dilaksanakan, ia menghasilkan keputusan berikut:
Address of var variable: bffd8b3cAddress stored in ip variable: bffd8b3cValue of *ip variable: 20
Penunjuk NULL dalam C
dalam Apabila mengisytiharkan pembolehubah, jika tiada alamat yang tepat untuk memberikan nilai, ia adalah amalan pengaturcaraan yang baik untuk memberikan nilai NULL kepada pembolehubah penunjuk. Penunjuk yang diberi nilai NULL dipanggil penunjuk null.
NULL penunjuk ialah pemalar yang ditakrifkan dalam pustaka standard dengan nilai sifar. Sila lihat program berikut:
#include <stdio.h>int main (){ int *ptr = NULL; printf("ptr 的值是 %x\n", ptr ); return 0;}
Apabila kod di atas disusun dan dilaksanakan, ia menghasilkan keputusan berikut:
ptr 的值是 0
Pada kebanyakan sistem pengendalian, program tidak dibenarkan mengakses alamat 0 daripada memori kerana memori ini dikhaskan oleh sistem pengendalian. Walau bagaimanapun, alamat memori 0 mempunyai kepentingan istimewa kerana ia menunjukkan bahawa penunjuk tidak menghala ke lokasi memori yang boleh diakses. Tetapi mengikut konvensyen, jika penunjuk mengandungi nol (nilai sifar), ia diandaikan menunjuk kepada tiada.
Untuk menyemak penunjuk nol, anda boleh menggunakan pernyataan if, seperti yang ditunjukkan di bawah:
if(ptr) /* 如果 p 非空,则完成 */if(!ptr) /* 如果 p 为空,则完成 */
Penjelasan terperinci tentang penunjuk C
Dalam C, terdapat banyak penunjuk- konsep-konsep yang berkaitan konsep ini adalah mudah, tetapi penting. Di bawah disenaraikan beberapa konsep berkaitan penuding penting yang mesti diketahui oleh pengaturcara C:
概念 | 描述 |
---|---|
指针的算术运算 | 可以对指针进行四种算术运算:++、--、+、- |
指针数组 | 可以定义用来存储指针的数组。 |
指向指针的指针 | C 允许指向指针的指针。 |
传递指针给函数 | 通过引用或地址传递参数,使传递的参数在调用函数中被改变。 |
从函数返回指针 | C 允许函数返回指针到局部变量、静态变量和动态内存分配。 |