Halo, dan selamat
datang kembali Dalam kuliah ini, saya ingin memberikan
demonstrasi tantangan kami untuk aritmatika pointer dan menggunakan pengubah konstanta.
Mari kita memunculkan blok kode. Saya akan membuat proyek baru. Kita akan memberi nama
contoh aritmatika pointer yang satu ini.
Jadi apa yang akan kita lakukan di
sini adalah kita akan benar-benar menentukan panjang string dengan menggunakan aritmatika titik.
Jadi hal pertama yang ingin saya lakukan adalah membuat deklarasi fungsi saya.
Ini akan mengembalikan panjang string. Jadi itu akan memiliki int
sebagai tipe pengembalian. Saya akan menyebutnya panjang string,
dan ini hanya akan mengambil pointer, tapi itu akan menjadi pointer konstan.
Kami tidak ingin mengubah nilai dari apa yang ditunjuk.
Jadi itu berarti kita akan menggunakan konstanta sebagai kata kunci pertama, dan
kemudian kita akan menentukan tipenya, yang merupakan karakter.
Dan kami akan mengatakan bintang, dan kami dapat menamainya apa pun yang kami inginkan, string.
Sekali lagi hanya untuk mengulangi, jika kita akan menempatkan konstanta di sini sebagai
gantinya, ini akan mengatakan bahwa alamat pointer,
nilai pointer tidak dapat berubah.
Tetapi sekali lagi, ini agak berlebihan dan tidak perlu dilakukan
karena kita melakukan pass by value pass by copy.
Jadi Anda tetap memiliki salinan alamatnya sehingga tidak masalah jika Anda mengubahnya di sana.
Tetapi penting untuk mengubah apa yang Anda tuju. Jika Anda tidak ingin nilai dari
apa yang Anda tuju berubah, Anda pasti ingin melakukannya terus-menerus di sini, dan
itu penting.
Jadi sekarang yang harus kita lakukan adalah membuat main.
membuat utama kami. Semua yang akan kita lakukan
di main kita adalah kita akan memanggil
panjang string, fungsi panjang string dengan string yang berbeda.
Jadi mari kita cetak, dan ingat, itu mengembalikan bilangan bulat sehingga kita bisa mengatakan persen d dan
kita hanya akan mencetak panjang beberapa string yang kita lewati.
Jadi kita akan memanggil panjang string, dan kita
hanya akan meneruskan beberapa string konstan, jadi kita bisa menempatkan sesuatu
dalam tanda kutip ganda di sini. Kita bahkan tidak perlu membuat pointer.
Anda bisa membuat pointer dan menetapkannya lalu meneruskannya, tetapi
Anda hanya perlu memastikan itu konstan.
Tetapi karena lebih mudah dalam kode yang lebih sedikit, kita bisa mengatakan tes panjang string.
Sekali lagi, itu adalah string literal konstan.
Kami akan mengujinya dengan lebih banyak lagi.
Kami akan memberi spasi setelahnya. Mari tambahkan beberapa umpan baris.
Di sini kita akan memanggil panjang string. Dan sebenarnya sebut saja dengan string
kosong, pastikan kita menjadi nol. Dan kemudian
yang ketiga kami akan mengatakan panjang senar,
kami hanya akan mengatakan jason.
Sekarang kebetulan, ketika Anda membuat ini dan meneruskan tautan panjang string ini,
mereka secara otomatis mendapatkan terminator nol yang ditambahkan ke dalamnya.
Kami mempelajarinya ketika kami mendeklarasikan pointer.
Itu salah satu kelebihannya. Jika Anda akan membuat pointer dan itu
akan menjadi literal, Anda tidak ingin menentukan ukurannya.
Anda ingin melakukan sesuatu seperti karakter jika itu adalah array
karena array adalah array adalah pointer. Tetapi jika kita
tidak ingin menentukan ukurannya, kita bisa mengatakan
karakter p dan kemudian di dalam sini kita bisa mengatakan jason.
Ingat pelajaran di mana jika kita tidak menentukan ukuran untuk array karakter, itu
akan secara otomatis menambahkan terminator nol dan membuat ukuran untuk Anda.
Dengan begitu Anda tidak melakukan kesalahan. Jika Anda memasukkan ukuran ke dalam
array, Anda mungkin tidak memiliki cukup terminator nol.
Itu hal yang sama ketika kita meneruskan literal ke panjang
string, terminator nol ditambahkan ke ujungnya.
Jadi kita bisa membuat variabel-variabel ini
pada awalnya dan melakukan sesuatu seperti ini
dan kemudian meneruskannya masing-masing.
Tapi saya tidak ingin membuang waktu untuk membuat variabel. Jadi aku hanya akan melakukan itu.
Sekarang yang benar-benar penting untuk kode ini adalah fungsinya.
Jadi kita akan membuat panjang string kita. Ingat lagi, ia mengembalikan bilangan bulat,
dan itu akan menjadi konstanta. Jadi kita bisa mengatakan string bintang char konstan.
Dan Anda juga memperhatikan bahwa nama variabel
deklarasi fungsi tidak harus cocok. Saya bisa menempatkan ini sebagai string dan itu bagus juga.
Sekarang di dalam fungsi ini, kita harus membuat pointer lokal karena pointer lokal
akan menunjuk ke ujung string. Dan kemudian setelah kita memiliki alamat
untuk akhir string, kita dapat mengurangi alamat untuk awal string.
Alamat untuk awal string adalah apa yang diteruskan.
String secara otomatis akan menunjuk ke elemen pertama dalam array atau
alamat pertama dari array.
Jadi jika kita membuat pointer lokal
dan kita hanya ingin membuat lagi bintang char
konstan dan kita hanya akan mengatakan alamat terakhir bagaimana.
Dan ini akan sama dengan alamat awal string, dan kemudian kita
akan menambahkannya setiap kali dalam loop kita.
Jadi sekarang kita memiliki alamat terakhir. Sekali lagi, ini adalah variabel
lokal yang akan menyimpan alamat tepat sebelum terminator nol.
Jadi sekarang kita bisa menulis while loop kita.
Dan loop while kita akan keluar ketika kita melihat terminator nol.
Sekarang kita bisa melakukan ini dengan dua cara yang berbeda.
Kita bisa membandingkan karakter. Jadi kita bisa mengatakan sesuatu
seperti sementara bintang alamat terakhir karena kita harus de-referensi
itu tidak sama
dengan backslash nol bisa melakukan sesuatu seperti itu,
tapi itu semacam banyak kode. Yang perlu kita lakukan
hanyalah mengatakan
while at last address. Karena jika Anda
mendereferensi terminator nol, itu akan sama
dengan nol, dan nol sama dengan salah.
Kita tahu bahwa Boolean memiliki satu benar nol adalah salah.
Jadi jika itu salah, itu akan melompat keluar. Jadi yang perlu Anda
lakukan adalah di dalam kondisi saat Anda meletakkan alamat bintang terakhir.
Sekali lagi, ini akan melakukan dereference pointer.
Dan begitu itu menunjuk ke alamat terakhir, itu akan menunjuk ke terminator nol.
Sekarang kita harus memastikan bahwa kita mengubah alamat terakhir, sehingga akhirnya menunjuk ke terminator nol.
Di sini yang bisa kita lakukan hanyalah mengatakan plus plus alamat terakhir.
Jadi setiap iterasi dari while loop ini akan menambah alamat
sampai melihat nol.
Sebuah nol mewakili terminator nol.
Jadi hasil akhir setelah while loop
selesai dieksekusi, alamat terakhir akan menunjuk ke alamat terminator nol.
Kami kemudian dapat mengurangi alamat terminator nol dari alamat
yang diteruskan, string kami, dan itu akan memberi kami panjang kami.
Jadi hanya itu yang harus kita lakukan di baris berikutnya. Kami hanya bisa mengatakan kembalikan alamat
terakhir kami dan
kami benar-benar ingin mengurangi alamatnya,
jadi kami tidak perlu melakukan de-referensi apa pun atau menggunakan
operator tipuan, alamat terakhir dikurangi string. Jadi string dilewatkan, kami
tidak mengubahnya sama sekali.
Itu menunjuk ke karakter pertama. Itu akan menunjuk ke j.
Itu akan menjadi alamat atau untuk pertama kalinya kami menelepon di baris delapan, itu akan menjadi alamat s.
Alamat terakhir akan menunjuk ke alamat t terakhir ini.
Sebenarnya satu lebih dari itu, terminator nol. Jika kita mengatakan alamat terakhir
dikurangi alamat s, itu akan memberi kita panjangnya.
Dan itulah yang akan kita kembalikan.
Jadi saya harap itu masuk akal.
Sekali lagi, pada baris 17, kita membuat variabel
lokal karena kita perlu melacak alamat terakhir, alamat
terminator nol.
Setelah while loop selesai berjalan, alamat terakhir akan menunjuk ke
setelah t, terminator nol.
Kemudian kita bisa mengurangi alamat terakhir dari string, alamat string menunjuk
ke s ketika itu masuk, kita tidak mengubahnya.
Jadi mari kita lihat bagaimana jika ini memberi kita kembali panjang yang benar.
Saat kita menjalankan ini, kita akan melihat panjang string yang kita lewati.
Jadi kita melihat 17 0 dan 5.
Mari kita lihat 1 2 3 4 5 6 7 8
9 10 11 12 13, Anda harus menghitung spasi, 14
15 16 17. Itu benar kita
beri tanda kutip ganda yang kosong, jadi seharusnya nol dan
kemudian Jason harus 5 jadi 17 0 dan 5, itu benar.
Jadi apa yang kami lakukan di sini
adalah kami menggunakan aritmatika pointer untuk mendapatkan alamat terakhir plus
ditambah operator inkremental, dan kemudian
mengarahkan aritmatika kami untuk mendapatkan panjang dengan mengurangi alamat terakhir dikurangi string.
Cukup rapi. Saya mencoba menunjukkan
kekuatan aritmatika titik, kenyamanan notasinya.
Bagaimana Anda dapat dengan mudah menambah, mengurangi
untuk sampai ke berbagai tempat dalam array
karakter dan mengeluarkan karakter. Dalam hal ini, kami hanya mendapatkan alamat dan
kemudian menggunakan alamat untuk saling mengurangi untuk mendapatkan panjangnya.
Jadi saya harap ini bermanfaat. Pastikan Anda memahami semua yang baru saja saya sebutkan.
Sekali lagi, konsep konstanta, konsep plus plus, konsep kondisi jika
Anda mendereferensi alamat dan itu menunjuk
ke terminator nol, itu nol sehingga melompat keluar, dan kemudian konsep
minus dua alamat ini. Terima kasih.