Halo, dan selamat datang kembali. Dalam kuliah ini saya ingin berbicara tentang aritmatika titik.
Sekarang setelah kita memahami hubungan antara array dan
pointer, konsep ini akan lebih mudah dipahami.
Kami mengatakan aritmatika, tetapi kami tidak benar-benar --
semua itu benar-benar berarti Anda dapat melakukan
plus atau minus atau penambahan atau pengurangan pada pointer itu sendiri.
Jadi kekuatan sebenarnya dari menggunakan pointer ke array ikut bermain ketika Anda
ingin mengurutkan melalui elemen array.
Anda ingin beralih dari elemen pertama hingga akhir, Anda ingin mengulanginya.
Ini adalah penunjuk kekuatan yang sebenarnya. Karena titik pointer
menggunakan alamat, setiap elemen dalam array hanyalah alamat lain.
Jadi Anda bisa melakukan plus plus pada pointer dan Anda bisa pergi ke alamat berikutnya.
Jadi di sini nilai pointer dapat digunakan untuk mengakses integer pertama
dari array nilai.
Ini dapat digunakan untuk mengakses nilai sub-0.
Jadi jika Anda ingat nilai pointer adalah pointer yang
menunjuk ke array integer.
Dan kami menetapkannya ke elemen pertama dalam array dengan hanya menetapkan pointer ke nama array.
Kita juga bisa menggunakan alamat operator sub-0 jika kita mau.
Tetapi ketika kita mendereferensi nilai pointer
karena menunjuk ke elemen pertama dalam larik,
itu akan memberi Anda bilangan bulat pertama dalam larik nilai sub-0.
Jika Anda ingin mereferensikan nilai sub
3 melalui variabel pointer, yang harus Anda lakukan adalah menambahkan 3 ke pointer nilai
dan kemudian menerapkan operator tipuan untuk mendereferensikannya.
Jadi Anda bisa melakukan sesuatu seperti ini. Anda dapat mengatakan nilai pointer plus 3 dan
kemudian dereferensi dengan tanda bintang.
Dan Anda biasanya meletakkan tanda bintang di luar tanda kutip untuk memperjelas.
Tapi apa yang dilakukan ini adalah mengatakan nilai
pointer, yang merupakan alamat dari elemen pertama dalam array, itu menambahkan 3 untuk itu.
Jadi itu akan benar-benar menambahkan untuk setiap byte untuk bilangan bulat,
itu akan mengalikan byte kali bilangan bulat.
Tapi ini pada dasarnya akan menunjuk ke sub
3, elemen ke-4 dalam array.
Jadi dalam ekspresi asterisk nilai pointer plus i yang
dapat digunakan untuk mengakses nilai apapun yang terkandung dalam array nilai.
Jadi, jika Anda memahami ekspresi ini, Anda dapat menambahkan apa pun ke i dan
itu akan mengarahkan Anda ke array elemen tertentu.
Jadi jika Anda ingin menetapkan nilai di bawah 10 hingga 27,
yang harus Anda lakukan adalah jika Anda menggunakan
pointer, katakan nilai pointer plus 10 dan kemudian dereferensi dan katakan sama dengan 27.
Jadi Anda melihat sintaks yang berbeda di sini.
Sekali lagi, ini kenyamanan notasi tetapi juga lebih efisien dalam hal program itu sendiri.
Jadi pointer karena mereka sangat erat kaitannya dengan array, Anda
dapat dengan mudah mengakses elemen hanya dengan menambah pointer yang berkurang
atau menambahkan nilai atau mengurangi nilai dari sebuah pointer.
Sangat, sangat berguna.
Untuk menyetel penunjuk nilai agar menunjuk ke elemen kedua dari larik nilai,
Anda dapat menerapkan operator alamat ke nilai sub 1 dan menetapkan hasilnya ke penunjuk nilai.
Kami melihat ini. Ini hanyalah cara lain untuk melakukan hal yang sama
yang saya sebutkan sebelumnya jika Anda ingin menggunakan sub operator alamat.
Anda selalu dapat melakukan ini jika
Anda mau, tetapi jauh lebih nyaman untuk melakukan aritmatika pointer.
Jika penunjuk nilai menunjuk ke nilai sub-0, Anda
dapat mengatur pada titik nilai satu hanya dengan menambahkan satu
ke nilai penunjuk nilai. Dan inilah yang sebenarnya kita maksudkan dengan aritmatika titik.
Yang harus Anda lakukan adalah mengatakan nilai poin atau
plus sama dengan satu, dan sekarang penunjuk nilai menunjuk ke elemen kedua dalam
array atau indeks pertama.
Notasi yang sangat, sangat bagus, sangat mudah dilakukan.
Jadi ini adalah ekspresi yang benar-benar valid dalam c
dan dapat digunakan untuk pointer ke tipe data apa pun apakah itu
karakter integer atau apa pun. Dan Anda mungkin harus memikirkan betapa bergunanya ini dalam karakter.
Jika Anda memiliki pointer karakter, Anda sekarang dapat mengakses
setiap elemen, setiap karakter dalam string hanya dengan melakukan plus plus pada pointer.
Operator penambahan dan pengurangan plus plus dan minus minus
sangat berguna saat menangani pointer ini karena
Anda biasanya ingin berpindah dari satu elemen ke elemen berikutnya dan seterusnya.
Menambahkan 22 atau dikurangi 20 bukanlah hal biasa karena
Anda biasanya melakukannya secara berurutan.
Jadi menggunakan operator kenaikan dalam sebuah pointer memiliki efek yang sama seperti menambahkan satu ke pointer.
Menggunakan operator penurunan memiliki efek yang sama seperti mengurangi satu dari pointer.
Jadi mengatakan pointer nilai plus plus
akan mengatur pointer nilai yang menunjuk bilangan bulat berikutnya dalam array nilai.
Minus minus harus pointer nilai Apakah akan mengatur
pointer nilai yang menunjuk ke bilangan bulat sebelumnya dalam array nilai.
Tetapi Anda ingin berhati-hati saat melakukan minus minus
karena Anda ingin memastikan bahwa Anda setidaknya berada dalam array dan tidak berada di 0.
Dan hal yang sama berlaku untuk plus plus.
Jika Anda berada di akhir array, Anda tidak ingin ada kesalahan di luar batas.
Jadi pastikan bahwa penunjuk nilai jika Anda menguranginya,
itu tidak menunjuk ke awal array nilai pada awalnya.
Contoh lain di sini
di mana kita benar-benar akan menjumlahkan semua elemen dalam
array, Anda melihat bahwa kita memiliki fungsi
penjumlahan array dan fungsi tersebut mengambil
array dan juga mengambil bilangan bulat konstan sebagai parameter.
Di dalam fungsi, kita akan membuat integer.
Kita akan menginisialisasi jumlah integer ke 0, dan kita akan membuat pointer
integer, pointer ke tipe int.
Kami juga akan membuat pointer
yang konstan.
Jadi artinya Anda tidak dapat mengubah alamatnya.
Itu akan selalu menjadi array plus n dan akan diberi nama array end.
Kami melakukan ini karena membuat loop kami lebih efisien jika kami
mengaturnya untuk pergi ke ujung array dan hanya melihat pointer.
Jadi ujung array menunjuk ke alamat ujung array.
Kita dapat mengatakan array, yang merupakan apa yang dilewatkan dan kemudian
n adalah
ukuran, ukuran array.
Sekarang loop for akan menginisialisasi pointer variabel kontrol loop, yang
merupakan pointer ke array. Dan yang harus Anda lakukan
adalah jika Anda ingin menetapkan pointer ke elemen pertama dari sebuah array, yang harus Anda
lakukan adalah mengatakan pointer sama dengan array.
Dan kemudian kondisi keluar loop kami adalah jika pointer kurang dari akhir array.
Ingat, pointer adalah alamat dan ujung array juga merupakan alamat.
Jadi kita katakan jika alamat pada pointer kurang dari pointer n,
maka kita ingin mengeksekusi body loop.
Pointer hanyalah bilangan bulat, ini adalah alamat heksadesimal.
Setiap kali kami menambahkan, itu menuju ke alamat berikutnya. Kami memiliki alamat akhir, sehingga kami
dapat mengatakan pergi melalui loop sampai kami mencapai akhir.
Dan kemudian kita menaikkan pointer itu sendiri, yang
akan menaikkan alamat untuk pergi ke elemen berikutnya dalam array pada dasarnya
karena itulah yang kita tunjuk.
Kemudian kami memiliki di dalam tubuh loop kami, kami mengatakan jumlah plus sama dengan pointer.
Kami mendereferensi pointer untuk mendapatkan nilai
karena ingat kami ingin mendapatkan nilai yang tidak kami inginkan
untuk mendapatkan alamat pointer atau alamat pointer yang ditunjuk.
Dan kemudian di bagian paling akhir, kami mengembalikan jumlahnya. Jadi ini akan
menjumlahkan semua elemen dalam array.
Anda akan melihat di utama, kami juga melakukan deklarasi fungsi di sana
sebagai lawan dari bagian atas file. Saya biasanya suka meletakkannya di bagian atas file.
Tapi di utama, kami membuat array 10 elemen, 3 7 negatif 9 dan seterusnya.
Kami kemudian meneruskan array atau jumlah, dan kami
menentukan ukurannya sebagai 10.
Dan apa yang akan Anda perhatikan adalah ia mengembalikan nilai yang merupakan jumlah dari array.
Jadi sangat, sangat bagus untuk menggunakan aritmatika titik ini untuk beralih melalui array,
kita bisa menambahkan
ke alamat berikutnya dan juga melihat alamat akhir untuk melompat keluar.
Ini lebih efisien dengan penunjuk yang melihat alamat akhir dibandingkan
dengan penghitung yang melihat kurang dari n.
Dan Anda juga memperhatikan kami membuatnya sebagai konstanta karena konstanta tidak berubah
dan itu lebih efisien dengan kompiler.
Array di sini adalah pointer konstan yang berarti bahwa alamatnya tidak dapat diubah.
Anda juga harus memperhatikan dalam
contoh ini bahwa untuk meneruskan array ke suatu fungsi, Anda cukup menentukan nama array.
Jadi kita tahu bagaimana melewati fungsi kenaikan. Dan untuk menghasilkan pointer ke array,
Anda hanya perlu menentukan nama array.
Kami melihat bahwa ketika kami menetapkan elemen pertama dari array ke sebuah pointer.
Jadi apa yang disiratkannya adalah bahwa panggilan ke fungsi
penjumlahan array mereka yang diteruskan ke fungsi sebenarnya adalah penunjuk ke nilai array.
Dan ini benar-benar memberitahu Anda bahwa array dan pointer sangat, sangat erat terkait, bahwa
array tidak lebih dari sebuah pointer.
Dan ini menjelaskan mengapa Anda dapat mengubah elemen array dari dalam suatu fungsi.
Karena hingga saat ini, saat Anda meneruskan data ke suatu fungsi, data tersebut tidak
akan diubah di luar fungsi itu kecuali jika itu adalah penunjuk.
Karena itulah mengapa kita harus memasukkan alamat untuk scanf.
Satu-satunya cara elemen diubah di luar suatu fungsi adalah jika
Anda meneruskan pointer ke suatu fungsi.
Dan karena elemen dimodifikasi di dalam fungsi itu, ini
menyiratkan bahwa Anda melewatkan sebuah pointer.
Dan ini sekali lagi membuktikan bahwa
ketika Anda bahwa array dan pointer sangat, sangat mirip dalam array itu memang pointer hanya
menggunakan sintaks yang berbeda.
Kita akan berbicara tentang bagaimana kita dapat melewati referensi atau benar-benar
melewatkan salinan referensi, yang akan memungkinkan Anda
untuk mengubah data dalam suatu fungsi di luar fungsi itu.
Jika Anda ingat dari salah satu tantangan kami
sebelumnya, setiap kali kami ingin mengubah data dalam suatu fungsi, kami
harus menggunakan variabel global.
Karena kami tidak memahami konsep passing
by reference dan kami tidak memahami konsep pointer.
Tapi saya sebutkan sebelumnya juga salah satu keuntungan dari pointer adalah
Anda sekarang dapat mengubah data di dalam suatu fungsi dan itu akan tercermin di luar fungsi itu.
Tapi itu kuliah lain.
Tetapi konsep itu sendiri karena contoh sebelumnya menunjukkan bagaimana array
pada dasarnya adalah pointer.
Jadi Anda mungkin bertanya-tanya mengapa parameter formal di dalam fungsi tidak dinyatakan sebagai pointer.
Bisa jadi. Kita bisa melakukan sesuatu seperti ini, int array sum, int star array.
Kita tidak perlu mendeklarasikannya sebagai array.
Ini benar-benar valid karena array dan pointer sama dengan yang bisa kita katakan int star array.
Kami menyebutkan mereka benar-benar terkait erat.
Jadi Anda bisa mendeklarasikan tipe array menjadi tipe array int
di dalam fungsi penjumlahan array atau Anda bisa mendeklarasikannya sebagai pointer ke int.
Dan itulah mengapa Anda melihat banyak fungsi yang menerima array sebagai parameter atau
sebagai argumen di mana parameter sebenarnya adalah pointer.
Jadi, jika Anda akan menggunakan nomor indeks untuk mereferensikan elemen larik yang diteruskan ke
suatu fungsi, maka deklarasikan parameter sebagai larik.
Lagi-lagi kemudahan notasi, hanya saja cara notasinya yang
berbeda, baik menggunakan tanda kurung dan subscript atau menggunakan pointer.
Array itu sendiri biasanya lebih mudah
dibaca dalam hal pemeliharaan program lebih tepat mencerminkan penggunaan array oleh fungsi.
Tapi pointer lebih mudah digunakan.
Dan jika Anda menggunakan argumen sebagai pointer ke array, nyatakan sebagai tipe
pointer di parameter formal.
Jadi, inilah contoh dengan notasi pointer dari fungsi di
mana contoh sebelumnya menggunakan notasi array.
Di sini kita hanya mengatakan int start
array dan apa yang akan Anda perhatikan adalah fungsinya segera menjadi
jauh lebih kecil, karena kita tidak harus menetapkan pointer ke array ke elemen pertama
seperti yang kita lakukan.
Loop juga menjadi jauh lebih kecil karena kita tidak
perlu melakukan tugas itu di pernyataan pertama.
Kami hanya bisa mengatakan sampai array kurang dari akhir array dan
kami dapat menambah array. Jadi kodenya sedikit lebih sedikit,
masih sangat jelas apa yang terjadi semoga jika Anda memahami array dan pointer.
Kami meneruskan array int star, dan
kami tidak perlu menginisialisasi array itu lagi karena kami meneruskannya
di pointer, kami tidak menginisialisasi pointer lagi.
Dan kemudian kita sebenarnya mengatur alamat akhir array
ke pointer konstan,
akhir array. Kami menggunakannya untuk
melompat keluar dari loop, dan kami hanya mengatakan sum
plus equals star array, menggunakan operator tipuan untuk mendereferensi array lagi, mengembalikan jumlah.
Dan kemudian fungsi utamanya persis sama kecuali deklarasi sekarang menjadi pointer sebagai lawan dari array.
Jadi di sini ada 2 contoh menggunakan notasi berbeda tetapi menyediakan fungsionalitas yang
sama dan itulah mengapa Anda melihat banyak pointer sebagai parameter
di dalam parameter fungsi.
Jadi untuk meringkas di sini adalah beberapa hal yang valid ketika Anda menggunakan
pointer dan hal-hal yang tidak valid.
Jadi jika kita mendeklarasikan beberapa variabel di sini, kita mendeklarasikan sebuah array bernama Earn
dan mengandung 3 elemen dan kemudian kita mendeklarasikan 2 pointer.
Sekarang pada pointer itu, kita bisa melakukan aritmatika. Kita bisa mengatakan pointer satu plus plus.
Kita dapat mengatakan poin atau 2 sama dengan poin atau satu ditambah 2.
Kita bahkan bisa mengatakan pointer 2 sama dengan penghasilan plus satu.
Sangat sah untuk melakukan itu karena Anda memiliki pointer dan Anda memodifikasi pointer dengan
alamat, sehingga Anda dapat melakukan aritmatika titik.
Anda tidak dapat melakukan aritmatika titik pada array. Jadi Anda tidak bisa mengatakan mendapatkan plus plus.
Anda tidak bisa mengatakan pointer 2 0. 2 ditambah 0. 1
karena itu adalah alamat.
Dan Anda sebenarnya tidak menunjuk ke apa
pun di dalam array.
Dan Anda tidak dapat mengalikan dapatkan poin kali atau satu untuk mendapatkan poin atau 2.
Itu tidak valid.
Jadi perhatikan sintaks yang benar untuk aritmatika pointer
dan juga pahami bahwa aritmatika titik hanya dapat diterapkan pada pointer,
bukan array.
Juga fungsi yang memproses array sebenarnya menggunakan pointer sebagai argumen.
Anda memiliki pilihan antara notasi array dan notasi pointer untuk
menulis fungsi pemrosesan array.
Jadi, jika Anda akan memproses fungsi acak, tidak apa-apa menggunakan pointer sebagai parameter.
Anda dapat memilih mana yang ingin Anda gunakan.
Tetapi menggunakan pointer biasanya lebih sedikit kode dan lebih efisien.
Menggunakan notasi array membuatnya lebih jelas bahwa fungsinya bekerja dengan array dan
notasi array memiliki tampilan yang lebih akrab bagi programmer yang memiliki
beberapa latar belakang pemrograman dalam bahasa tertentu.
Jadi jika Anda memprogram sebelumnya dan Fortran dan Pascal dan
seterusnya, Anda dapat menggunakan notasi panah.
Pemrogram lain mungkin lebih terbiasa bekerja dengan pointer dan mungkin menganggap notasi
pointer lebih alami, hanya lebih masuk akal.
Ini lebih dekat ke bahasa mesin menggunakan aritmatika
titik dan notasi penunjuk dengan beberapa kompiler yang mengarah ke kode yang lebih efisien,
alasan lain untuk menggunakannya.
Jadi mari kita lihat contoh-contoh ini di dalam
blok kode.
Jadi inilah contoh kami dari slide. Kami memiliki deklarasi fungsi kami di baris 3.
Ini adalah jumlah array.
Dan dalam contoh ini, kita akan menggunakan notasi array.
Jadi kita akan menggunakan tanda kurung saat kita menggunakan indeks.
Dan kita akan menyebutnya
meneruskan array nilai dan meneruskan ukurannya.
Jadi fungsi array sum mengambil array integer. Nah, hal pertama yang harus kamu
lakukan adalah membuat pointer yang ingin kamu gunakan untuk aritmatika
titik pada baris 14. Dan kemudian Anda harus
menetapkan akhir array ke array alamat plus ukurannya.
Itulah akhir dari array, yang sekarang dapat Anda gunakan untuk keluar dari loop.
Tapi kita harus menetapkan pointer ke array.
Kita tahu bahwa kita dapat menetapkan array ke
pointer untuk menunjuk ke elemen pertama hanya dengan menggunakan nama array.
Kita tidak harus menggunakan alamat operatif.
Kita bisa jika kita mau, kita benar-benar bisa melakukan sesuatu seperti ini.
Dan ini juga baik-baik saja.
Dan kemudian kita plus plus pointer. Kami menambah penunjuk karena semua
yang dilakukan bertambah ke alamat berikutnya. Ini menunjuk ke elemen berikutnya dalam array.
Dan kemudian pada baris 18, kita mendereferensi pointer untuk menghitung
jumlah, jumlah sama, jumlah ditambah nilai pointer yang ditunjuknya.
Jadi jika kita membangun ini, kita memiliki satu peringatan, yang utama
bukan int, kita ingin mengubah ini karena ada
baiknya mengembalikan nilai kesalahan dari utama dan katakan
saja kembalikan 0.
Anda bisa kembali jika ada kesalahan di
utama, Anda kembali yang negatif. Sekarang kita menjalankan ini, Anda akan melihat bahwa itu hanya
melakukan jumlah nilai dalam array, yaitu 3 ditambah 7 ditambah negatif 9 dan seterusnya,
bahkan tidak yakin apa itu tetapi sepertinya 21.
Sekarang kita dapat dengan mudah memodifikasi parameter array
ini untuk mengambil pointer hanya dengan mendeklarasikan asterisk sebelum pointer.
Kami menyebutnya dengan cara yang sama. Kami hanya memodifikasi. Kita tidak perlu mendeklarasikan
pointer lagi. Kita mungkin ingin mengubah
nama untuk membuatnya lebih mudah, tetapi kita tidak perlu mendeklarasikan pointer ini lagi.
Kami masih ingin mendapatkan akhir dari array dan
kami juga tidak perlu menetapkannya lagi.
Kita hanya bisa memiliki barang kosong di sana. Dan mungkin lebih berguna untuk memiliki loop sementara di sini.
Tetapi jika kita tidak memiliki tugas, kita bisa meletakkan titik koma di sana.
Dan sekarang kami baik-baik saja. Kami masih ingin melakukan de-referensi dan kami masih ingin mengembalikannya.
Tetapi jika
kita membangun ini, kita
ingin memastikan bahwa kita mendefinisikan deklarasi fungsi sebagai pointer sejak kita mengubahnya.
Dan ini bisa nama apa saja tapi kami akan konsisten.
Sekarang kita membangun,
kita ingin memastikan bahwa kita kembali menggunakan semua
variabel yang kita ubah.
Jadi sekarang kami berhasil membangunnya, kami menjalankannya dan Anda melihat
Anda mendapatkan hasil yang sama yaitu 21.
Jadi pahami perbedaan antara menggunakan pointer sebagai parameter formal dalam array,
Anda
dapat menggunakannya secara bergantian. Ini hanya kenyamanan notasi.
Tetapi Anda biasanya memiliki lebih sedikit kode, ketika Anda menggunakan pointer.
Dan Anda dapat memanipulasinya lebih banyak dan Anda dapat melakukan hal-hal yang lebih
kuat, biasanya juga lebih efisien berdasarkan pada kompiler. Terima kasih.