Saya baru memulai dengan pointer, dan saya sedikit bingung. Saya tahu &
berarti alamat suatu variabel dan yang *
dapat digunakan di depan variabel pointer untuk mendapatkan nilai objek yang ditunjuk oleh pointer. Tetapi berbagai hal bekerja secara berbeda ketika Anda bekerja dengan array, string atau ketika Anda memanggil fungsi dengan salinan pointer variabel. Sulit untuk melihat pola logika di dalam semua ini.
Kapan saya harus menggunakan &
dan *
?
RTFM
tidak membantu, dan terus terang sangat kasar. Jika Anda tidak punya waktu untuk menjawab, maka hormatilah mereka yang meluangkan waktu untuk menjawab pertanyaan-pertanyaan ini. Saya berharap saya bisa @ ini ke "anon" tapi jelas dia tidak punya waktu untuk berkontribusi dengan cara yang berarti.Jawaban:
Anda memiliki petunjuk dan nilai:
Anda mengubah pointer menjadi nilai dengan
*
:Anda mengubah nilai menjadi pointer dengan
&
:Sunting: Dalam hal array, mereka diperlakukan seperti pointer. Jika Anda menganggapnya sebagai pointer, Anda akan menggunakan
*
untuk mendapatkan nilai-nilai di dalamnya seperti yang dijelaskan di atas, tetapi ada juga cara lain yang lebih umum menggunakan[]
operator:Untuk mendapatkan elemen kedua:
Jadi
[]
operator pengindeksan adalah bentuk khusus dari*
operator, dan berfungsi seperti ini:sumber
int aX[] = {3, 4}; int *bX = &aX;
int *bX = &aX;
tidak berfungsi karenaaX
sudah mengembalikan alamataX[0]
(yaitu&aX[0]
), jadi&aX
akan mendapatkan alamat dari alamat yang tidak masuk akal. Apakah ini benar?int aX[] = {3,4};
,int **bX = &aX;
adalah kesalahan.&aX
adalah tipe "pointer to array [2] dariint
", bukan "pointer to pointer toint
". Secara khusus, nama array tidak diperlakukan sebagai penunjuk ke elemen pertama untuk unary&
. Anda dapat melakukan:int (*bX)[2] = &aX;
Ada pola ketika berhadapan dengan array dan fungsi; awalnya agak sulit dilihat.
Ketika berhadapan dengan array, ada baiknya untuk mengingat hal-hal berikut: ketika ekspresi array muncul di sebagian besar konteks, jenis ekspresi secara implisit dikonversi dari "N-element array T" ke "pointer ke T", dan nilainya diatur untuk menunjuk ke elemen pertama dalam array. Pengecualian untuk aturan ini adalah ketika ekspresi array muncul sebagai operan dari
&
atausizeof
operator, atau ketika itu adalah string literal digunakan sebagai initializer dalam deklarasi.Jadi, ketika Anda memanggil fungsi dengan ekspresi array sebagai argumen, fungsi tersebut akan menerima pointer, bukan array:
Inilah sebabnya mengapa Anda tidak menggunakan
&
operator untuk argumen yang terkait dengan "% s" discanf()
:Karena konversi tersirat,
scanf()
menerimachar *
nilai yang menunjuk ke awalstr
array. Ini berlaku untuk setiap fungsi yang disebut dengan ekspresi array sebagai argumen (hampir semuastr*
fungsi,*scanf
dan*printf
fungsi, dll.).Dalam praktiknya, Anda mungkin tidak akan pernah memanggil fungsi dengan ekspresi array menggunakan
&
operator, seperti pada:Kode seperti itu sangat tidak umum; Anda harus mengetahui ukuran array dalam deklarasi fungsi, dan fungsi hanya bekerja dengan pointer ke array ukuran tertentu (pointer ke array 10-elemen T adalah jenis yang berbeda dari pointer ke array 11-elemen dari T).
Ketika ekspresi array muncul sebagai operan ke
&
operator, jenis ekspresi yang dihasilkan adalah "pointer ke array elemen-N dari T", atauT (*)[N]
, yang berbeda dari array pointer (T *[N]
) dan pointer ke tipe dasar (T *
).Ketika berhadapan dengan fungsi dan pointer, aturan yang harus diingat adalah: jika Anda ingin mengubah nilai argumen dan memilikinya tercermin dalam kode panggilan, Anda harus meneruskan pointer ke hal yang ingin Anda modifikasi. Sekali lagi, array melemparkan sedikit kunci pas ke dalam karya, tetapi kita akan berurusan dengan kasus normal terlebih dahulu.
Ingatlah bahwa C lewat semua argumen fungsi dengan nilai; parameter formal menerima salinan nilai dalam parameter aktual, dan setiap perubahan pada parameter formal tidak tercermin dalam parameter aktual. Contoh umum adalah fungsi swap:
Anda akan mendapatkan output berikut:
Parameter formal
x
dany
objek berbeda daria
danb
, sehingga berubah menjadix
dany
tidak tercermin dalama
danb
. Karena kami ingin memodifikasi nilaia
danb
, kami harus meneruskan pointer ke fungsi swap:Sekarang output Anda akan menjadi
Perhatikan bahwa, dalam fungsi swap, kami tidak mengubah nilai
x
dany
, tetapi nilai apax
dany
menunjuk ke . Menulis ke*x
berbeda dari menulis kex
; kami tidak memperbarui nilaix
itu sendiri, kami mendapatkan lokasi darix
dan memperbarui nilai di lokasi itu.Ini sama benarnya jika kita ingin memodifikasi nilai pointer; jika kita menulis
maka kita memodifikasi nilai parameter input
stream
, bukanstream
menunjuk ke apa , jadi mengubahstream
tidak berpengaruh pada nilaiin
; agar ini berfungsi, kita harus meneruskan sebuah pointer ke pointer:Sekali lagi, array melemparkan sedikit kunci pas ke dalam karya. Saat Anda meneruskan ekspresi array ke suatu fungsi, fungsi yang diterima adalah sebuah pointer. Karena bagaimana array subscript didefinisikan, Anda bisa menggunakan operator subskrip pada pointer dengan cara yang sama Anda bisa menggunakannya pada array:
Perhatikan bahwa objek array mungkin tidak ditugaskan; yaitu, Anda tidak dapat melakukan sesuatu seperti
jadi Anda ingin berhati-hati ketika berhadapan dengan pointer ke array; sesuatu seperti
tidak akan bekerja
sumber
Sederhananya
&
berarti alamat-dari , Anda akan melihat bahwa di placeholder untuk fungsi untuk memodifikasi variabel parameter seperti dalam C, variabel parameter dilewatkan oleh nilai, menggunakan ampersand berarti untuk melewati referensi.*
berarti dereferensi variabel penunjuk, artinya mendapatkan nilai variabel penunjuk itu.Contoh di atas menggambarkan cara memanggil fungsi
foo
dengan menggunakan pass-by-reference, bandingkan dengan iniBerikut ilustrasi penggunaan dereference
Di atas menggambarkan bagaimana kita mendapatkan alamat-
y
dan menetapkannya ke variabel pointerp
. Kemudian kami melakukan dereferensip
dengan melampirkan bagian*
depannya untuk mendapatkan nilaip
, yaitu*p
.sumber
Ya itu bisa sangat rumit karena
*
digunakan untuk berbagai keperluan di C / C ++.Jika
*
muncul di depan variabel / fungsi yang sudah dideklarasikan, itu berarti bahwa:*
memberikan akses ke nilai variabel itu (jika jenis variabel itu adalah tipe pointer, atau*
operator yang kelebihan beban ).*
memiliki arti operator pengganda, dalam hal ini, harus ada variabel lain di sebelah kiri*
Jika
*
muncul dalam deklarasi variabel atau fungsi itu berarti bahwa variabel itu adalah pointer:Jika
&
muncul dalam deklarasi variabel atau fungsi, itu umumnya berarti bahwa variabel tersebut adalah referensi ke variabel jenis itu.Jika
&
muncul di depan variabel yang sudah dideklarasikan, itu mengembalikan alamat variabel ituSelain itu Anda harus tahu, bahwa ketika meneruskan array ke suatu fungsi, Anda harus selalu melewati ukuran array dari array itu juga, kecuali ketika array tersebut adalah sesuatu seperti cstring (char array) yang diakhiri 0.
sumber
Ketika Anda mendeklarasikan variabel pointer atau parameter fungsi, gunakan *:
NB: setiap variabel yang dideklarasikan memerlukan * sendiri.
Saat Anda ingin mengambil alamat suatu nilai, gunakan &. Saat Anda ingin membaca atau menulis nilai dalam sebuah pointer, gunakan *.
Array biasanya hanya diperlakukan seperti pointer. Ketika Anda mendeklarasikan parameter array dalam suatu fungsi, Anda dapat dengan mudah mendeklarasikannya sebagai pointer (artinya sama). Ketika Anda melewatkan sebuah array ke suatu fungsi, Anda sebenarnya meneruskan sebuah pointer ke elemen pertama.
Pointer fungsi adalah satu-satunya hal yang tidak cukup mengikuti aturan. Anda dapat mengambil alamat suatu fungsi tanpa menggunakan &, dan Anda dapat memanggil pointer fungsi tanpa menggunakan *.
sumber
Saya sedang melihat semua penjelasan bertele-tele jadi alih-alih beralih ke video dari University of New South Wales untuk penyelamatan. Berikut adalah penjelasan sederhana: jika kita memiliki sel yang memiliki alamat
x
dan nilai7
, cara tidak langsung untuk meminta alamat nilai7
adalah&7
dan cara tidak langsung untuk meminta nilai di alamatx
adalah .*x
Jadi(cell: x , value: 7) == (cell: &7 , value: *x)
. Cara lain untuk melihatnya:John
duduk di7th seat
.*7th seat
Akan menunjuk keJohn
dan&John
akan memberikanaddress
/ lokasi7th seat
. Penjelasan sederhana ini membantu saya dan berharap itu akan membantu orang lain juga. Berikut tautan untuk video luar biasa: klik di sini.Ini adalah contoh lain:
Add-on: Selalu inisialisasi pointer sebelum menggunakannya. Jika tidak, pointer akan menunjuk ke apa pun, yang dapat mengakibatkan crash program karena sistem operasi akan mencegah Anda mengakses memori yang ia tahu tidak Anda miliki.
p = &x;
, kami menetapkan penunjuk lokasi tertentu.sumber
Sebenarnya, Anda sudah memilikinya, tidak ada lagi yang perlu Anda ketahui :-)
Saya hanya akan menambahkan bit-bit berikut:
&
mengambil variabel dan memberi Anda alamat,*
mengambil alamat, dan memberi Anda variabel (atau konten).char **p
berarti itup
adalah pointer ke pointer kechar
.Mengenai hal-hal yang bekerja secara berbeda, tidak juga:
\0
).sumber
Saya pikir Anda agak bingung. Anda harus membaca tutorial / buku petunjuk yang bagus.
Ini tutorial sangat baik untuk pemula (jelas menjelaskan apa
&
dan*
yang). Dan ya jangan lupa membaca buku Pointers in C karya Kenneth Reek.Perbedaan antara
&
dan*
sangat jelas.Contoh:
sumber
Oke, sepertinya posting Anda sudah diedit ...
Lihat bagaimana Anda bisa menggunakan
&
untuk mendapatkan alamat awal struktur array? Pengikutakan melakukan hal yang sama.
sumber