Sejauh yang saya tahu, tidak ada alasan saya tidak diizinkan untuk memberikan referensi ke pointer di C ++. Namun, upaya saya untuk melakukannya gagal, dan saya tidak tahu mengapa.
Inilah yang saya lakukan:
void myfunc(string*& val)
{
// Do stuff to the string pointer
}
// sometime later
{
// ...
string s;
myfunc(&s);
// ...
}
Dan saya mendapatkan kesalahan ini:
tidak dapat mengonversi parameter 1 dari 'std :: string *' ke 'std :: string * &'
string* const& val
alih - alih persamaan yang kurang dapat dibaca seperti misalnyaconst string* &val
. Untuk mata saya ini jelas merupakan referensi const , ke pointer, ke string. Saya pribadi lebih suka menulisT const&
daripadaconst T&
dalam deklarasi untuk mendapatkan klarifikasi yang tepat ini.bind a temporary to the reference
ini lebih jelas dalam jawaban ini daripada @Chris 'asreference to an actual string pointer in the calling scope, not an anonymous string pointer
. Bagaimanapun, keduanya kemungkinan benar dari sudut pandang saya.const string*&
danstring* const&
sebenarnya jenis yang berbeda. Yang pertama adalahconst
referensi ke aconst string*
, sedangkan yang kedua adalahconst
referensi ke astring*
.T const&
toconst T&
- seperti yang ditunjukkan oleh @Justin Time, mereka adalah tipe yang berbeda. Ini mungkin tidak memiliki konsekuensi kadang-kadang, tetapi dalam situasi lain akan benar-benar penting untuk memilih satu atau yang lain, seperti lebih memilihint
untukdouble
.Ubah ke:
EDIT:
Ini disebut
ref-to-pointer
dan Anda tidak dapat memberikan alamat sementara sebagai referensi untuk fungsi. (kecuali jika ituconst reference
).Meskipun, saya telah menunjukkan
std::string* pS = &s;
(pointer ke variabel lokal), penggunaannya yang khas adalah: ketika Anda ingin callee untuk mengubah pointer itu sendiri, bukan objek yang ditunjuknya. Misalnya, fungsi yang mengalokasikan memori dan menetapkan alamat blok memori yang dialokasikan untuk argumennya harus mengambil referensi ke pointer, atau pointer ke pointer:sumber
&s
menghasilkan penunjuk sementara ke string dan Anda tidak dapat membuat referensi ke objek sementara.sumber
Mencoba:
atau
sumber
EDIT: Saya mencoba beberapa, dan menemukan sesuatu yang sedikit lebih halus dari yang saya kira. Inilah yang sekarang saya pikirkan adalah jawaban yang akurat.
&s
bukan lvalue sehingga Anda tidak dapat membuat referensi untuk itu kecuali jika jenis rujukannya adalahconst
. Jadi misalnya, Anda tidak dapat melakukannyatapi kamu bisa melakukannya
Jika Anda meletakkan deklarasi serupa di header fungsi, itu akan berfungsi.
Ada masalah lain, yaitu, sementara. Aturannya adalah Anda hanya bisa mendapatkan referensi sementara jika itu
const
. Jadi dalam hal ini orang mungkin berpendapat bahwa & s bersifat sementara, dan karenanya harus dinyatakanconst
dalam prototipe fungsi. Dari sudut pandang praktis, tidak ada bedanya dalam kasus ini. (Ini baik nilai atau sementara. Either way, aturan yang sama berlaku.) Namun, secara tegas, saya pikir itu bukan sementara tapi nilai. Saya bertanya-tanya apakah ada cara untuk membedakan keduanya. (Mungkin hanya didefinisikan bahwa semua temporari adalah nilai, dan semua bukan-nilai adalah temporal. Saya bukan ahli dalam standar.)Yang sedang berkata, masalah Anda mungkin pada tingkat yang lebih tinggi. Mengapa Anda ingin referensi ke alamat
s
? Jika Anda ingin referensi ke pointers
, Anda perlu mendefinisikan pointer seperti diJika Anda ingin referensi
s
atau penunjuks
, lakukan hal langsung.sumber
Saya baru saja menggunakan referensi ke pointer untuk membuat semua pointer di pohon biner yang dihapus kecuali root safe. Untuk membuat pointer aman, kita hanya perlu mengaturnya ke 0. Saya tidak bisa membuat fungsi yang menghapus pohon (hanya menyimpan root) untuk menerima ref ke pointer karena saya menggunakan root (pointer ini) sebagai yang pertama masukan untuk melintasi kiri dan kanan.
Intinya, referensi ke pointer tidak valid ketika parameter formal adalah pointer (ini).
sumber
Selamat datang di C ++ 11 dan nilai referensi:
Sekarang Anda memiliki akses ke nilai pointer (disebut oleh
val
), yang merupakan alamat string.Anda dapat memodifikasi pointer, dan tidak ada yang peduli. Itu adalah salah satu aspek dari apa nilai di tempat pertama.
Hati-hati: Nilai pointer hanya valid hingga
myfunc()
kembali. Akhirnya, ini hanya sementara.sumber
Saya tahu bahwa itu mungkin untuk melewati referensi pointer, saya melakukannya minggu lalu, tetapi saya tidak ingat apa sintaksinya, karena kode Anda terlihat benar di otak saya saat ini. Namun opsi lain adalah menggunakan pointer dari pointer:
sumber
myfunc ("string * & val") ini sendiri tidak masuk akal. "string * & val" menyiratkan "string val", * dan & membatalkan satu sama lain. Akhirnya kita tidak bisa memasukkan variabel string ke suatu fungsi ("string val"). Hanya tipe data dasar yang dapat diteruskan ke suatu fungsi, untuk tipe data lainnya harus lulus sebagai penunjuk atau referensi. Anda dapat memiliki string & val atau string * val ke suatu fungsi.
sumber