Semasa proses pengaturcaraan C++, pengkompil sering mengeluarkan pelbagai mesej ralat. Antaranya, adalah lebih biasa untuk menemui mesej ralat "Tidak boleh memulakan rujukan dengan penuding nol". Sebab ralat ini ialah kami menggunakan penuding nol untuk memulakan rujukan, dan rujukan tidak boleh menunjuk ke alamat nol. Artikel ini akan memperkenalkan cara membetulkan ralat ini apabila menghadapinya dalam C++.
Pertama, mari kita semak secara ringkas konsep penunjuk dan rujukan dalam C++. Penunjuk ialah pembolehubah yang nilainya ialah alamat pembolehubah lain. Penunjuk boleh dinyahrujuk untuk mengakses nilai yang ditunjukkan oleh alamat. Rujukan ialah alias untuk pembolehubah sedia ada. Rujukan tidak perlu dinyahrujuk kerana ia sudah menjadi alias bagi pembolehubah yang dirujuknya dan tidak boleh menunjuk ke alamat nol.
Seterusnya, mari kita lihat contoh kod berikut:
int main() { int* p = nullptr; int& ref = *p; return 0; }
Dalam kod ini, kami mula-mula mengisytiharkan penunjuk kepada jenis integer p
dan memulakannya kepada nullptr
. Kemudian, kami mentakrifkan rujukan jenis integer ref
dan cuba memulakannya kepada *p
, iaitu alamat yang ditunjukkan oleh nilai p
penunjuk . Walau bagaimanapun, oleh kerana p
ialah penunjuk nol, ralat berlaku semasa memulakan rujukan ref
, kerana rujukan tidak boleh menunjuk ke alamat nol. p
,并将其初始化为nullptr
。接着,我们又定义了一个整数类型的引用ref
,并试图将其初始化为*p
,即指向指针p
指向的地址的值。然而,由于p
是一个空指针,所以在初始化引用ref
时会发生错误,因为一个引用不能指向空地址。
那么,我们应该如何修改这个错误呢?解决这个问题的关键是要确保引用ref
指向了一个有效的地址。我们可以通过修改指针p
来实现这一点,或者在引用的声明中添加初始化条件来确保其指向有效地址。下面分别进行说明。
首先,我们可以通过检查指针的值是否为nullptr
来确保其指向有效地址。如果指针指向了一个有效地址,则可以定义引用并将其初始化为指针所指向的地址,如下所示:
int main() { int* p = new int(10); int& ref = *p; delete p; return 0; }
在这段代码中,我们使用new
运算符在堆上创建了一个int类型的变量,并将指针p
指向了这个变量的地址。接着,我们定义了一个整数类型的引用ref
,并将其初始化为*p
。在尝试访问引用时,由于指针p
所指向的地址有效,因此不会发生任何错误。最后,我们在程序结束前使用了delete
运算符来释放指针所指向的内存。
其次,我们可以在引用的声明中添加初始化条件,以确保其指向有效地址。下面是一段示例代码:
int main() { int* p = nullptr; int i = 10; int& ref = (p != nullptr) ? *p : i; return 0; }
在这段代码中,我们定义了一个整数类型的变量i
,并将指针p
初始化为nullptr
。接着,我们定义了一个整数类型的引用ref
,并在其声明中添加了一个初始化条件:如果指针p
指向了有效地址,则将引用初始化为*p
,否则初始化为i
ref
menghala ke alamat yang sah. Kita boleh melakukan ini dengan mengubah suai penunjuk p
, atau dengan menambahkan syarat permulaan pada pengisytiharan rujukan untuk memastikan ia menunjuk ke alamat yang sah. Masing-masing diterangkan di bawah. Pertama sekali, kita boleh memastikan bahawa penuding menghala ke alamat yang sah dengan menyemak sama ada nilai penuding ialah nullptr
. Jika penuding menghala ke alamat yang sah, anda boleh mentakrifkan rujukan dan memulakannya ke alamat yang ditunjuk oleh penuding, seperti ini: 🎜rrreee🎜Dalam kod ini, kami menggunakan operator baharu
untuk menambah nilai baharu kepada timbunan Pembolehubah jenis int dicipta dan penunjuk p
menghala ke alamat pembolehubah ini. Seterusnya, kami mentakrifkan rujukan jenis integer ref
dan memulakannya kepada *p
. Apabila cuba mengakses rujukan, tiada ralat berlaku kerana alamat yang ditunjukkan oleh penunjuk p
adalah sah. Akhir sekali, kami menggunakan operator delete
untuk melepaskan memori yang ditunjuk oleh penuding sebelum program tamat. 🎜🎜Kedua, kami boleh menambah syarat permulaan dalam pengisytiharan rujukan untuk memastikan ia menunjuk ke alamat yang sah. Berikut ialah contoh kod: 🎜rrreee🎜Dalam kod ini, kami mentakrifkan pembolehubah jenis integer i
dan memulakan penuding p
kepada nullptr
. Seterusnya, kami mentakrifkan rujukan jenis integer ref
dan menambah syarat permulaan pada pengisytiharannya: jika penunjuk p
menghala ke alamat yang sah, rujukan dimulakan kepada *p
, jika tidak dimulakan kepada i
. Dengan cara ini, kami boleh mengendalikannya sambil memastikan bahawa rujukan tidak menghala ke alamat batal. 🎜🎜Ringkasnya, apabila pengkompil menggesa "rujukan tidak boleh dimulakan dengan penuding nol", kita perlu memberi perhatian kepada isu permulaan rujukan. Untuk mengelakkan ralat ini, kita harus memastikan bahawa rujukan merujuk kepada alamat yang sah dan menggunakan pertimbangan bersyarat yang sesuai semasa permulaan. 🎜Atas ialah kandungan terperinci Ralat kompilasi C++: Tidak dapat memulakan rujukan dengan penuding nol, bagaimana saya harus mengubah suainya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!