Halo, dan selamat datang kembali.
Dalam kuliah ini, saya ingin berbicara tentang use
case untuk pointer ketika kita akan menggunakannya bagaimana kita akan menggunakannya. Kita tahu cara membuatnya.
mendeklarasikannya dan mendefinisikannya.
Kami tahu cara menetapkan alamat variabel yang ada kepada mereka menggunakan alamat operator.
Dan kita tahu bagaimana menghilangkan referensi
mereka, bagaimana mendapatkan nilai yang ditunjuk oleh pointer.
Sekarang bagaimana kita benar-benar mulai menggunakannya.
Jadi c menawarkan beberapa operasi dasar yang dapat Anda lakukan pada pointer.
Anda dapat menetapkan alamat ke pointer
yang telah kita pelajari.
Ini adalah variabel yang ada di mana variabel memiliki alamat.
Dan Anda hanya melihat alamat variabel itu dengan menggunakan alamat operator,
dan kami ada benarnya. Kita juga bisa menetapkan pointer yang ada ke pointer lain.
Itu 2 cara Anda dapat menetapkan alamat ke pointer.
Jadi itu bisa menjadi nama array dengan sendirinya.
Kami belum berbicara tentang array, tetapi ketika Anda menetapkan kenaikan gaji ke pointer,
yang harus Anda lakukan adalah menentukan namanya. Anda bahkan tidak perlu menggunakan alamat operator.
Sejauh ini kita hanya fokus menggunakan variabel yang ada
dan meneruskan alamat variabel itu sendiri.
Tetapi 3 cara yang dapat Anda lakukan disebutkan di sana.
Anda juga dapat melakukan dereferensi pointer. Kami baru belajar tentang itu di situlah Anda
menggunakan, tanda bintang operator tipuan.
Ini akan memberi Anda nilai yang disimpan dalam pointer ke. Pointer nilai pointer yang
merupakan alamat yang ditunjuk oleh titik, gunakan
saja itu. Anda juga dapat mengambil alamat penunjuk.
Ini adalah alamat sebenarnya dari penunjuk saat Anda membuat
penunjuk tempat penunjuk itu sendiri disimpan.
Anda dapat menggunakan alamat saya memiliki operator pada pointer itu juga.
Dan Anda juga dapat melakukan aritmatika pointer. Kita akan memiliki kuliah terpisah tentang ini.
Di sinilah Anda dapat menggunakan operator plus
dan minus untuk menambahkan bilangan bulat ke penunjuk atau mengurangi bilangan bulat dari penunjuk.
Dan ini memungkinkan Anda untuk memiliki notasi khusus dan
memungkinkan Anda melompat-lompat di memori lebih cepat, terutama jika Anda menggunakan array.
Jadi apa yang biasanya Anda lakukan adalah ketika Anda menambahkan
bilangan bulat ke pointer menggunakan
operator plus, itu
hanya akan mengatur alamat pointer itu sampai banyak byte.
Jika Anda
mengurangi angka dari sebuah pointer, itu
akan mengatur alamat itu dikurangi sejumlah byte tertentu.
Anda juga dapat menambah pengurangan satu per
satu, dan Anda akan melihat ini sangat umum ketika kita menggunakannya dalam array.
Jadi ketika Anda berada dalam array dan Anda ingin pindah ke elemen berikutnya alih-alih menggunakan indeks, Anda
dapat menggunakan pointer dan hanya menambahnya satu per satu.
Jika Anda ingin pindah ke elemen sebelumnya alih-alih menggunakan indeks, Anda
bisa menguranginya dengan menunjuk satu.
Jadi aritmatika pointer, kita akan membicarakannya secara eksklusif, tetapi itu adalah
sesuatu yang dapat Anda lakukan dengan pointer.
Dan sekali lagi, ini adalah notasi khusus yang memungkinkan Anda untuk bergerak
cepat dalam memori, menjadi
lebih efisien.
Anda juga dapat menemukan perbedaan antara 2 pointer.
Jadi, jika Anda memiliki 2 pointer dan elemen-elemennya berada dalam array yang
sama, Anda mungkin ingin mengetahui seberapa
jauh jaraknya, elemen-elemennya, Anda dapat menguranginya.
Ini akan menjadi perbedaan dari
2 pointer dan. Jadi, jika Anda mengindeks 5 dan kemudian
Anda memiliki titik penunjuk di indeks 5, Anda memiliki titik lain yang menunjuk ke
titik yang menunjuk ke indeks 15, Anda
bisa menguranginya dan itu
akan memberi Anda berapa banyak elemen yang hilang, karena itu akan menjadi alamat
heksadesimal dikurangi alamat heksadesimal lainnya dengan asumsi array dalam
memori terus menerus yang itu, itu akan menampilkan seberapa jauh mereka.
Anda dapat menggunakan operator relasional untuk membandingkan nilai dari 2 pointer.
Pointer harus tipe yang sama. Jadi jika keduanya menunjuk bilangan bulat, keduanya
harus bertipe sama.
Ini hanya akan memberi tahu Anda apakah alamatnya lebih besar dari atau kurang dari.
Sekali lagi, Anda dapat mengidentifikasi bagian mana dari larik tempat Anda berada.
Ada juga 2 bentuk pengurangan.
Jadi saya baru saja berbicara tentang
pengurangan di mana Anda benar-benar dapat mengambil satu pointer dan menguranginya dari
yang lain yang
Anda akan mendapatkan pointer atau Anda dapat mengurangi satu
pointer dari integer, yang akan memberi Anda sebuah pointer.
Jadi kurangi satu pointer dari yang lain untuk mendapatkan integer
atau kurangi integer dari pointer untuk mendapatkan pointer. Itu adalah 2 kasus.
Jadi kita akan ingat bahwa kita akan pergi melalui beberapa contoh lagi.
Berhati-hatilah saat Anda menggunakan penambahan atau pengurangan pointer dan menyebabkan
larik di luar batas. Jadi sebagian besar hal yang Anda
lakukan dengan aritmatika pointer adalah saat Anda mengoperasikan array.
Karena sekali lagi, ini memungkinkan Anda untuk bergerak cepat, sintaksnya sederhana.
Tapi ingat, array memiliki kesalahan di luar batas.
Jadi jika Anda bertambah terlalu jauh, Anda akan
melampaui batas dalam array. Jika Anda mengurangi terlalu jauh,
Anda akan memiliki batas bawah, Anda akan menjadi angka negatif.
Komputer itu sendiri tidak akan melacak apakah pointer masih menunjuk ke elemen array.
Jadi menggunakan titik aritmatika pada array, Anda harus berhati-hati.
Jika Anda ingin pointer digunakan dalam ekspresi, Anda juga bisa melakukannya.
Jadi kami membicarakan ini sedikit lebih awal, dan kami mendereferensikan pointer dan kami menambahkan
15 padanya. Saya pikir kami mendapat 20.
Jadi nilai pointer pi dapat digunakan dalam ekspresi aritmatika.
Jadi, jika suatu variabel didefinisikan bertipe pointer ke integer, maka
variabel tersebut dievaluasi menggunakan aturan aritmatika integer.
Dan kami menunjukkan itu dengan dereference. Jadi, jika Anda
memiliki variabel dan Anda memiliki pointer, inisialisasi ke null, lalu tanda tangani
pointer Anda ke alamat variabel itu. Anda kemudian bisa mengatakan bintang pnumber plus sama dengan 25.
Ingat, pnumber bintang mendapatkan nilai yang ditunjuk.
Jadi yang dilakukan adalah mengatakan nilai pnumber sama
dengan nilai pnumber ditambah 25.
Jadi nilainya akan sama dengan 35.
Ini tidak mengubah apa yang ditunjuk karena kami menggunakan tanda bintang, jadi itu tidak
mengubah alamat yang kami tunjuk, itu
tidak mengubah alamat itu sendiri karena kami tidak memiliki alamat operator.
Kami mengubah nilai yang ditunjuknya.
Jadi menambah nilai variabel angka dengan 25, bintang menunjukkan bahwa Anda menanyakan
konten yang ditunjuk oleh variabel yang disebut pnumber.
Jika pointer menunjuk ke variabel x, pointer
tersebut telah didefinisikan sebagai pointer ke tipe data yang sama dengan x.
Jadi jika Anda membuat pointer akhir sebagai pointer float,
Anda hanya dapat memiliki
alamat tipe data yang float atau int tergantung yang mana yang Anda nyatakan.
Jadi penggunaan operator tipuan dalam suatu
ekspresi identik dengan penggunaan x dalam ekspresi yang sama.
Dan hanya itu yang dikatakan adalah jika Anda menggunakan pelampung atau Anda memiliki int
dan Anda menggunakan operator tipuan, Anda mendereferensikannya, Anda dapat melakukan apa pun
yang Anda bisa jika Anda memiliki pelampung di dalamnya, apa pun yang ditunjuknya.
Variabel yang didefinisikan sebagai pointer ke int dapat menyimpan alamat variabel apa pun
dari tipe apa pun, kita tahu itu.
Jadi di sini nilai int sama dengan 999, kita dapat menetapkan int itu
ke pnumber selama pnumber adalah penunjuk ke int, dan kemudian
kita bisa menambahkannya.
Pernyataan akan beroperasi dengan nilai variabel baru
dan nilai konten baru adalah 1024.
Pnumber menunjuk ke nilai,
alamat nilai. Jadi jika Anda mengubah pointer apa
yang menunjuk ke nilai, Anda akan mengubah nilai dari nilai variabel ini.
Jadi ingatlah bahwa ini adalah konsep mengubah variabel di satu titik
pointer dan Anda mengubahnya di beberapa variabel.
Pointer dapat berisi alamat variabel apa pun dengan tipe yang sesuai.
Jadi Anda dapat menggunakan satu variabel pointer untuk mengubah nilai dari banyak variabel yang berbeda
jika ada int atau double atau float. Selama mereka adalah tipe yang kompatibel dengan tipe
pointer, Anda dapat mengubah nilai itu. Anda tidak dapat mengubah
nilai pnumbers jika pnumber menunjuk ke float dan nilainya
adalah bilangan bulat. Anda tidak akan bisa melakukan itu. Anda akan mengalami kesalahan kompilasi.
Contoh lain di sini. Di sini kami akan
menunjukkan cara mendapatkan alamat beberapa variabel. Jadi di sini, di bagian utama ini,
kami melakukan beberapa
aritmatika pointer pada ekspresi yang sebenarnya.
Jadi kami tidak melakukan apa pun pada array, jadi kami tidak menambah atau mengurangi
pointer di dalamnya. Jadi kami mengurangi nilai. Jadi kami memiliki 2
tipe panjang num1 dan num2 dan kemudian kami memiliki pointer tipe panjang, kami menginisialisasi ke nol.
Kami menetapkan alamat num1 ke pnum pointer kami.
Dan kemudian kami menetapkan nilai pnum ke L, jadi
itu berarti num1 sekarang akan menjadi 2l.
Jika kita menambah num2, sekarang num2 belum melakukan
apa-apa.
Jadi nilai pnum adalah 2l, itu berarti nilai num1 adalah 2l.
L hanyalah akhiran untuk menandakan bahwa itu panjang.
Jika sekarang kita menambah nilai num2 panjang, itu
0l, itu akan menjadi 1l.
Jika kita mengatakan num2 plus sama dengan
pnum bintang, pnum adalah 2l, jadi itu akan menjadi
1l ditambah 2l, num2 sekarang akan sama dengan 3l.
Dan kemudian jika kita menetapkan alamat num2 ke pnum,
pnum sekarang akan sama dengan alamat num2.
Jadi jika kita menambah pnum
apa yang kita tunjuk, kita sekarang akan memiliki 4l.
Dan kita akan melihat ini di dalam blok yang dingin,
tapi saya akan memandu Anda melewatinya. Num1 akan sama dengan 2l.
Num2 akan sama dengan menunjuk
ke pnum.
Pnum 3l, jadi saya pikir itu akan menjadi 3l.
Pnum akan menjadi 3l, dan kemudian pneum ditambah num2 akan
menjadi 6l.
Jadi mari kita lihat apakah saya benar, baca ini dalam blok kode.
Jadi di sini kita berada di blok kode, mencoba melewati ini dengan tangan, tetapi
sekarang kita ingin melihat apakah kita benar. Mari kita gunakan debugger.
Kami akan menempatkan ini di sini dan kami akan melihat saat kami menjalani program bagaimana nilai berubah.
Jadi mari kita buat ini, dan mari kita debugnya.
Ini akan mulai dan akan berhenti di baris 10.
Dan jika kita membuka jendela arloji kita, yang
dapat kita lakukan dengan membuka debug di jendela arloji, arloji, kita
dapat melihat nilainya saat berjalan. Jadi sekarang num1
adalah nol, num2 adalah nol, pnum menunjuk ke nol.
Itu sebabnya 0x0, karena
kita tahu bahwa null mewakili 0 di pnumber.
Dan kita dapat menggunakannya ketika kita membandingkannya dalam pernyataan if.
Jadi setelah kita mengeksekusi baris 10, pnum seharusnya memiliki alamat num1.
Jadi mari kita melangkah.
Sekarang pnum memiliki alamat aktual 0x60ff08.
Setelah kita mengeksekusi baris 11, kita akan mengatakan nilai pnum sama dengan 2l, dan kita tidak akan benar-benar melihat
apa pun di jendela arloji untuk itu. Tapi mari kita lanjutkan dan jalankan, pnum
masih memiliki alamat yang sama.
Num1 sekarang diubah karena pnum memiliki
alamat num1, dan kami mengubahnya.
Jadi sekarang nomor 1 adalah 2. Sekarang di baris 12, kita akan menaikkan num2.
Jadi num2 hanya akan menjadi 1l.
Ini akan menjadi 1. Alamat pnum masih sama.
Sekarang kita akan menambahkan ke num2 apa
pun pnum itu. Pnum ingat menunjuk
ke num1, jadi num2 harus 3.
Lalu kita pergi ke 14, num2 adalah 3, num1 masih 2.
Sekarang pada baris 15, kita akan
memberikan pnum sebuah alamat baru dari num2. Jadi setelah
ini, kita tidak lagi menjadi 0x60ff08.
Kami akan menjadi 060ff04.
Jadi sekarang jika kita menaikkan nilai yang ditunjuk pnum yaitu angka 2
dan angka 2 adalah 3, angka 2 sekarang menjadi 4.
Dan kita lihat itu 4.
Sekarang kita akan mencetak semua nilai ini dan Anda akan melihat nilai num1
seharusnya 2.
Nilai num2 harus 4.
Pnum menunjuk ke num2, jadi itu harus tetap 4.
Dan kemudian kita akan mengatakan nilai pnum yang 4 plus,
num2 yang 4 seharusnya 8.
Jadi saya mungkin benar-benar pergi dengan 6.
Jadi sekarang kita tidak akan bisa melihatnya di jendela arloji. Jadi mari kita
mainkan dan lihat hasilnya sebagai pernyataan printf. Kita harus melihat 2448.
Jadi mari kita jalankan ini sekarang dalam mode
non-debug, dan kita melihat 2 4 4 8.
Jadi di sana kita pergi. Saya harap itu masuk akal.
Mari kita kembali dan melanjutkan diskusi kita.
Jadi bagaimana ketika kita menerima input, bagaimana kita bisa menggunakan pointer dengan cara itu.
Sejauh ini ketika kita menggunakan scanf untuk memasukkan nilai, kita harus menggunakan operator ampersand setiap kali
kita memiliki tipe data inter atau float. Satu-satunya waktu yang kita miliki adalah
ketika kita memiliki array karakter dan alasannya adalah karena karakter
a sebenarnya adalah penunjuk karakter yang akan kita bicarakan.
Tetapi jika kita menggunakan scanf untuk memasukkan nilai dan kita menggunakannya pada
tipe data normal yang bukan array karakter, kita selalu harus menggunakan operator tambah atau sub ini.
Dan alasannya adalah argumen kedua scanf adalah sebuah pointer.
Jadi kita harus mengirimkan alamatnya. Pointer hanya memiliki nilai alamat.
Jadi ketika Anda memiliki pointer yang sudah berisi alamat, Anda bisa menggunakan nama pointer sebagai argumen untuk scanf.
Jadi sekarang Anda tidak perlu menggunakan operator ampersand jika Anda benar-benar membuat
sebuah pointer, karena argumen kedua untuk scanf adalah sebuah pointer dan Anda
bisa menyebutkan nama pointernya saja.
Di masa lalu jika kita ingin menyimpan nilai dalam
nilai, kita akan mengatakan
nilai ampersand dalam argumen kedua scanf.
Tetapi jika kita memiliki pointer yang kita buat dan
sudah menunjuk ke alamat seperti pada
contoh ini, maka ketika kita menggunakan scanf, yang harus kita katakan adalah nama
nilai, nama pointer.
Jadi, inilah kasus ketika kita memiliki bilangan bulat, tetapi
kita tidak harus menggunakan ampersand karena kita memiliki penunjuk ke bilangan bulat.
Kami hanya mengatakan persen d, nilai p.
Jadi ada saat-saat lain ketika Anda dapat
meneruskan nama variabel biasa ke scanf selain array karakter jika
Anda memiliki pointer.
Anda juga dapat mencetak apa yang mereka masukkan setelahnya dan Anda akan
melihat bahwa nilai sebenarnya akan diubah menjadi apa pun yang mereka
masukkan karena kami menunjuk ke alamat itu.
Pengujian untuk nol.
Ada satu aturan yang harus Anda bakar ke dalam memori Anda. Ini sangat sangat penting.
Kami berbicara tentang dereferensi, tetapi apa yang terjadi jika Anda melakukan dereferensi pointer
yang tidak disengaja, pointer yang tidak menunjuk ke apa pun
atau pointer yang tidak memiliki memori yang dialokasikan untuk itu.
Jadi bagaimana jika kita melakukan sesuatu seperti ini. Kami mendeklarasikan sebuah pointer,
tetapi kami tidak pernah benar-benar menginisialisasinya, dan kemudian kami mencoba untuk menetapkannya.
Kami menghapus referensi dan menetapkannya, itu kesalahan besar.
Jadi baris kedua pada dasarnya berarti Anda
ingin menyimpan nilai 5 di lokasi yang ditunjuk
oleh pt, tetapi pt tidak menunjuk ke apa pun karena belum diinisialisasi.
Jadi pt sekarang akan memiliki nilai acak.
Jadi tidak ada yang tahu di mana 5 akan ditempatkan, itu bisa ditempatkan di mana saja di memori.
Ini mungkin tidak berbahaya. Ini mungkin melebih-lebihkan
data yang ada atau variabel status yang ada di program Anda.
Ini dapat menyebabkan program macet. Ini sangat bermasalah.
Jadi ketika Anda membuat pointer dan Anda mengalokasikan memori untuk menyimpan pointer itu sendiri, itu
tidak mengalokasikan memori untuk menyimpan data.
Jadi dengan mengatakan instar pt,
itu mengalokasikan memori untuk pointer, tetapi
tidak mengalokasikan memori untuk apa untuk
nilai pointer, alamatnya. Ingat, pointer berisi alamat.
Itu menciptakan pointer tetapi tidak membuat memori apa pun untuk apa yang ditunjuknya.
Jadi Anda tidak dapat melakukan dereferensi.
Jadi tidak mengalokasikan memori untuk menyimpan data.
Sebelum Anda menggunakan pointer, itu harus diberikan lokasi memori yang telah dialokasikan atau
Anda harus menggunakan alokasi memori dinamis menggunakan malloc yang akan kita bicarakan
Jadi, Anda dapat menetapkan alamat variabel yang ada ke pointer atau
Anda menggunakan malloc yang merupakan alokasi memori dinamis.
Tetapi ingatlah itu setiap kali Anda menggunakan pointer jika Anda membuatnya
dan itu nol, Anda ingin memeriksanya untuk nol
sebelumnya, kami akan membicarakannya sebentar lagi. Tetapi jika Anda membuat
pointer tidak diinisialisasi, jangan menetapkan apa pun
kecuali menunjuk ke variabel lain yang diinisialisasi seperti itu atau mengalokasikan memori.
Jadi di sinilah null berperan.
Anda benar-benar dapat menguji nol untuk memastikan
Anda tidak memiliki kesalahan dereferensi. Pastikan program Anda tidak macet.
Jadi kita sudah tahu bahwa null pada dasarnya
tidak menunjukkan apa-apa dan kita harus menginisialisasi semua variabel kita,
pointer kita ke null.
Jadi kita harus selalu melakukan hal seperti ini.
Null adalah simbol khusus dalam c yang mewakili penunjuk setara dengan
nol dengan angka biasa.
Di bawah ini juga menetapkan pointer ke nol menggunakan nol.
Jadi kita juga bisa jika kita tidak ingin meneruskannya atau menetapkannya ke nol, kita bisa mengatakan 0
dan itu sama dengan mengatakan tidak menunjuk ke nol.
Jadi karena null setara dengan 0, jika
Anda ingin menguji apakah nilai p adalah nol, Anda dapat melakukan sesuatu
seperti menggunakan pengujian eksplisit. Anda bisa mengatakan pointer sama dengan null.
Dan jika penunjuk sama dengan nol artinya nol,
maka Anda sebenarnya dapat melakukan sesuatu.
Jadi jika tidak nol atau tidak nol, itu salah satu nilai benar
atau lainnya, itu cara untuk memeriksa agar tidak crash.
Anda memastikan sebelum Anda benar-benar mencoba untuk mendereferensi sesuatu,
ini akan memberi tahu Anda apakah memori itu dialokasikan atau tidak.
Jadi, Anda ingin memeriksa nol sebelum Anda mereferensikan sebuah pointer.
Dan Anda sering melakukan ini di dalam
fungsi karena fungsi akan mengambil pointer sebagai parameter.
Dan jika penelepon mengirimkan
data yang buruk atau memasukkan pointer tidak memiliki memori yang dialokasikan, itu
bisa membuat kode Anda macet. Jadi yang ingin Anda lakukan adalah Anda
ingin memastikan bahwa penelepon memiliki alamat yang valid sehingga Anda dapat memeriksanya untuk nol.
Pada dasarnya, apa artinya ini selalu memiliki ini jika memeriksa
untuk mengatakan bukan nilai p atau bukan penunjuk.
Dan jika itu bukan pointer, maka Anda dapat melakukan dereferensi.
Kami berbicara banyak tentang pointer. Kami sudah membahas cukup banyak.
Saya yakin itu menjadi sedikit berlebihan. Anda mungkin ingin istirahat
dan menjalani kuliah sebelumnya mencoba untuk benar-benar menyelaraskan konsep ini di kepala Anda.
Pointer hanya berisi alamat.
Tapi ada 3 bagian, jadi bisa bermasalah.
Tapi tetap positif. Tetap bersamaku dan aku
tahu ini membingungkan.
Kami telah berbicara tentang bekerja dengan alamat.
Kami telah berbicara tentang bekerja dengan nilai-nilai. Kami telah berbicara tentang bekerja dengan pointer
itu sendiri, dan kami telah berbicara tentang bekerja dengan variabel yang menunjuk ke pointer.
Jadi, ada banyak hal yang
harus Anda ingat, dan itu bisa sangat melelahkan dan membuat frustrasi.
Dan selalu sulit untuk mencoba mencari tahu apa yang terjadi dan itu akan membutuhkan banyak latihan.
Cara terbaik untuk memahami konsep ini dan semua yang kita bicarakan sampai
sekarang adalah dengan berlatih,
menulis program singkat yang menggunakan semua konsep yang telah saya sebutkan.
Jadi tulis program yang
mendapatkan nilai menggunakan pointer, ini mungkin menggunakan
operator tipuan, dereferencing. Buatlah program yang mengubah nilai menggunakan pointer.
Jadi ini akan menjadi dereferensi, mendapatkan nilai menggunakan pointer hanya akan
menjadi nama pointer yang akan menjadi alamatnya. Mencetak alamat, kami telah memeriksa semua sintaks itu.
Latih hal ini berulang-ulang, itulah cara Anda akan mahir melakukannya.
Anda harus mendapatkan kepercayaan diri Anda dan Anda harus mempelajari konsep-konsep ini
secara rinci untuk menguasainya.
Masih banyak yang harus kita bicarakan tentang petunjuk, tetapi ini mungkin saatnya untuk menjauh dan membahas apa
yang telah kita bicarakan sejauh ini sehingga itu tertanam di kepala Anda.
Terima kasih.