Arithmatic Penuding di atas C

Halo di sana, pemrogram masa depan! Hari ini, kita akan menyusuri sebuah perjalanan yang menarik ke atas dunia arithmatic penuding di atas C. Jangan khawatir jika anda baru untuk pemrograman; Saya akan memandu anda melalui ini langkah demi langkah, seperti yang saya telah lakukan untuk pelbagai pelajar selama tahun tahun pengajaran saya. Jadi, ambil minuman kesukaan anda, dapatkan keselesaan, dan mari kita melompat masuk!

C - Pointer Arithmetics

Apa itu Penuding?

Sebelum kita melompat ke arithmatic penuding, mari untuk singkatkan apa itu penuding. Di atas C, penuding adalah sebuah pembolehubah yang menyimpan alamat memori dari pembolehubah lain. Pikirkan tentang itu seperti sebuah rakit yang menunjuk di mana beberapa data disimpan di atas memori komputer anda.

Inilah satu contoh ringkas:

int x = 10;
int *ptr = &x;

Dalam kod ini, ptr adalah sebuah penuding yang menyimpan alamat x. Operator & memberikan kita alamat x.

Sekarang kita telah penyegaran ingatan kita, mari kita eksplor tentang dunia penyihir arithmatic penuding!

Penambahan dan Pengurangan Penuding

Seperti pembolehubah biasa, kita boleh menambah dan mengurangkan penuding. Tetapi di sini tempat itu menjadi menarik: apabila kita menambah atau mengurangkan penuding, ia tidak hanya menambah atau mengurangkan 1 dari alamat. Sebaliknya, ia bergerak ke atas atau ke bawah elemen jenis data penuding yang menunjuk.

Mari lihat satu contoh:

int arr[] = {10, 20, 30, 40, 50};
int *ptr = arr;  // ptr menunjuk kepada elemen pertama arr

printf("%d\n", *ptr);  // Output: 10
ptr++;
printf("%d\n", *ptr);  // Output: 20
ptr--;
printf("%d\n", *ptr);  // Output: 10

Dalam kod ini, apabila kita menambah ptr, ia tidak hanya menambah 1 kepada alamat. Ia sebenarnya bergerak ke atas integer berikutnya di atas rak. Berikutnya, apabila kita mengurangkan, ia bergerak kembali ke integer sebelumnya.

Ia seperti untuk berjalan melalui sebuah rak, langkah demi langkah. Setiap langkah (penambahan atau pengurangan) memindahkan kita ke atas atau ke bawah elemen, tak kira berapa banyak bait yang elemen itu mengambil di atas memori.

Penambahan dan Pengurangan Integer ke atas Penuding

Kita juga boleh menambah atau mengurangkan integer ke atas/dari penuding. Operasi ini adalah seperti penambahan atau pengurangan, tetapi kita boleh bergerak beberapa langkah sekaligus.

Inilah satu contoh:

int arr[] = {10, 20, 30, 40, 50};
int *ptr = arr;

printf("%d\n", *(ptr + 2));  // Output: 30
printf("%d\n", *(ptr + 4));  // Output: 50
printf("%d\n", *(ptr - 1));  // Undefined behavior! Berhati-hati!

Apabila kita menambah 2 kepada ptr, kita tidak menambah 2 kepada alamat memori. Kita sebenarnya bergerak 2 integer ke atas di atas rak. Berikutnya, ptr + 4 memindahkan kita 4 integer ke atas.

Berhati-hati juga! Jika anda cuba untuk mengakses memori sebelum mula rak (seperti ptr - 1 apabila ptr di atas mula rak), atau selepas akhir rak, anda akan mendapat tingkah laku yang tidak ditakrif. Ia seperti untuk membaca halaman sebelumnya buku apabila anda sudah di atas halaman pertama – ia tidak wujud!

Pengurangan Penuding

Inilah satu tips yang baik: kita boleh mengurangkan satu penuding dari satu lagi untuk mencari keluar berapa banyak elemen di antara mereka. Ini hanya berfungsi jika kedua-dua penuding menunjuk kepada elemen di atas rak yang sama.

Mari lihat satu contoh:

int arr[] = {10, 20, 30, 40, 50};
int *ptr1 = arr;
int *ptr2 = &arr[3];

printf("%ld\n", ptr2 - ptr1);  // Output: 3
printf("%ld\n", ptr1 - ptr2);  // Output: -3

Dalam kod ini, ptr2 - ptr1 memberikan kita 3, kerana terdapat 3 elemen di antara arr[0] dan arr[3]. Perhatikan bahwa hasil adalah bertanda – jika kita mengurangkan penuding yang lebih besar dari satu yang lebih kecil, kita mendapat nombor negatif.

Perbandingan Penuding

Terakhir tetapi tidak terkecuali, kita boleh membandingkan penuding menggunakan operator relasional (<, >, <=, >=, ==, !=). Ini adalah sangat berguna apabila bekerja dengan rak.

Inilah satu contoh:

int arr[] = {10, 20, 30, 40, 50};
int *ptr1 = arr;
int *ptr2 = &arr[3];

if (ptr1 < ptr2) {
printf("ptr1 menunjuk kepada elemen yang datang sebelum elemen yang ptr2 menunjuk\n");
}

if (ptr1 == &arr[0]) {
printf("ptr1 menunjuk kepada elemen pertama rak\n");
}

Dalam kod ini, kita membandingkan kedudukan elemen yang ptr1 dan ptr2 menunjuk. Ingat, apabila kita membandingkan penuding, kita sebenarnya membandingkan alamat memori.

Ringkasan Operasi Arithmatic Penuding

Inilah satu rakit yang berguna untuk menjelaskan operasi arithmatic penuding yang kita telah belajar:

Operasi Keterangan Contoh
Penambahan (++) Pindah ke atas elemen berikutnya ptr++
Pengurangan (--) Pindah ke elemen sebelumnya ptr--
Penambahan (+) Pindah ke atas oleh n elemen ptr + n
Pengurangan (-) Pindah ke bawah oleh n elemen ptr - n
Pengurangan Penuding Mengira elemen di antara penuding ptr2 - ptr1
Perbandingan Membandingkan kedudukan elemen ptr1 < ptr2

Dan itu adalah untuk semua, rakan-rakan! Kita telah menyusuri atas arithmatic penuding di atas C. Ingat, dengan kuasa yang besar datang tanggungjawab yang besar. Arithmatic penuding adalah alat yang kuat, tetapi mereka juga boleh membawa kepada pepijat jika tidak digunakan dengan berhati-hati. Sentiasa pastikan anda tidak mengakses memori yang anda tidak sepatutnya!

Seperti yang saya sentiasa katakan kepada pelajar saya, cara terbaik untuk benar-benar memahami konsep ini adalah untuk melatih. Jadi, rakitkan pengkompiler C anda dan mula untuk eksperimen dengan operasi ini. Happy coding, dan jangan lupa untuk menunjuk penuding anda ke tempat yang anda maksudkan!

Credits: Image by storyset