---LESSON_INFO--- **Learning Objectives:** - Memahami konsep aritmatika pointer dalam bahasa C - Belajar melakukan operasi aritmatika pada pointer - Mengenal operasi increment, decrement, penjumlahan, dan pengurangan pada pointer - Memahami bagaimana aritmatika pointer digunakan dalam array **Prerequisites:** - Pemahaman tentang pointer - Pemahaman dasar tentang array ---END_LESSON_INFO--- # Aritmatika Pointer dalam C Anda sebelumnya belajar apa itu pointer dan bagaimana memanipulasi pointer. Dalam tutorial ini Anda akan belajar operasi aritmatika pada pointer. Ada banyak operasi aritmatika yang bisa diterapkan pada pointer C: ++, --, -, + ## Meningkatkan Pointer dengan (++) Sama seperti variabel lainnya, operasi ++ meningkatkan nilai dari variabel tersebut. Dalam kasus kita di sini variabel adalah pointer sehingga ketika kita meningkatkan nilainya kita meningkatkan alamat dalam memori yang ditunjuk oleh pointer tersebut. Mari kita gabungkan operasi ini dengan array dalam contoh kita: ```c #include int main() { int intarray[5] = {10,20,30,40,50}; int i; for(i = 0; i < 5; i++) printf("intarray[%d] has value %d - and address @ %x\\n", i, intarray[i], &intarray[i]); int *intpointer = &intarray[3]; //point to the 4th element in the array printf("address: %x - has value %d\\n", intpointer, *intpointer); //print the address of the 4th element intpointer++; //now increase the pointer's address so it points to the 5th elemnt in the array printf("address: %x - has value %d\\n", intpointer, *intpointer); //print the address of the 5th element return 0; } ``` ## Mengurangi Pointer dengan (--) Sama seperti dalam contoh sebelumnya kita meningkatkan alamat yang ditunjuk oleh pointer sebesar satu menggunakan operator ++, kita bisa mengurangi alamat yang ditunjuk sebesar satu menggunakan operator decrement (--). ```c #include int main() { int intarray[5] = {10,20,30,40,50}; int i; for(i = 0; i < 5; i++) printf("intarray[%d] has value %d - and address @ %x\\n", i, intarray[i], &intarray[i]); int *intpointer = &intarray[4]; //point to the 5th element in the array printf("address: %x - has value %d\\n", intpointer, *intpointer); //print the address of the 5th element intpointer--; //now decrease the point's address so it points to the 4th element in the array printf("address: %x - has value %d\\n", intpointer, *intpointer); //print the address of the 4th element return 0; } ``` ## Menambahkan Pointer dengan (+) Kita sebelumnya meningkatkan alamat yang ditunjuk oleh pointer sebesar satu. Kita juga bisa meningkatkannya dengan nilai integer seperti: ```c #include int main() { int intarray[5] = {10,20,30,40,50}; int i; for(i = 0; i < 5; i++) printf("intarray[%d] has value: %d - and address @ %x\\n", i, intarray[i], &intarray[i]); int *intpointer = &intarray[1]; //point to the 2nd element in the array printf("address: %x - has value %d\\n", intpointer, *intpointer); //print the address of the 2nd element intpointer += 2; //now shift by two the point's address so it points to the 4th element in the array printf("address: %x - has value %d\\n", intpointer, *intpointer); //print the addres of the 4th element return 0; } ``` Perhatikan bagaimana dalam output alamat bergeser sebanyak 8 langkah dalam memori. Anda mungkin bertanya-tanya mengapa? Jawabannya sederhana: Karena pointer kita adalah pointer int dan ukuran variabel int adalah 4 byte maka memori bergeser sebanyak blok 4 byte. Dalam kode kita bergeser sebanyak 2 (ditambahkan +2) ke alamat awal sehingga menjadi 2 x 4 byte = 8. ## Mengurangi Pointer dengan (-) Demikian pula kita bisa mengurangi: ```c #include int main() { int intarray[5] = {10,20,30,40,50}; int i; for(i = 0; i < 5; i++) printf("intarray[%d] has value: %d - and address @ %x\\n", i, intarray[i], &intarray[i]); int *intpointer = &intarray[4]; //point to the 5th element in the array printf("address: %x - has value %d\\n", intpointer, *intpointer); //print the address of the 5th element intpointer -= 2; //now shift by two the point's address so it points to the 3rd element in the array printf("address: %x - has value %d\\n", intpointer, *intpointer); //print the address of the 3rd element return 0; } ``` lagi-lagi alamat bergeser sebanyak blok 4byte (dalam kasus int). ## Operasi Lainnya Ada operasi lain seperti perbandingan >, <, ==. Idonya sangat mirip dengan membandingkan variabel, tetapi dalam hal ini kita membandingkan alamat memori. --- ## Tabel Operasi Aritmatika Pointer | Operasi | Deskripsi | Contoh | |---------|-----------|--------| | ptr++ | Menaikkan pointer ke elemen berikutnya | `ptr++` | | ptr-- | Menurunkan pointer ke elemen sebelumnya | `ptr--` | | ptr + n | Menambahkan n ke alamat pointer | `ptr + 2` | | ptr - n | Mengurangi n dari alamat pointer | `ptr - 1` | | ptr1 - ptr2 | Menghitung jarak antar pointer | `ptr1 - ptr2` | ---EXERCISE--- # Latihan: Aritmatika Pointer untuk Array Salin tiga alamat terakhir dari intarray ke parray yang merupakan array dari pointer ke int. **Requirements:** - Gunakan aritmatika pointer untuk mengakses elemen - Gunakan pointer untuk mengisi array pointer - Pastikan alamat disalin dengan benar **Expected Output:** ``` Matched! Matched! Matched! ``` Try writing your solution in the code editor below! ---KEY_TEXT--- pointer + i parray[i] = pointer + i for (i = 0; i < 3; i++) ---END_KEY_TEXT--- ---EXPECTED_OUTPUT--- Matched! Matched! Matched! ---END_EXPECTED_OUTPUT--- ---INITIAL_CODE--- #include int main() { int intarray[5] = {10,20,30,40,50}; //-----------------------^ int *pointer = &intarray[2]; // Array of 3 pointers int *parray[3]; // Copy last three addresses of intarray into parray // Use parray and pointer int i; for (i = 0; i < 3; i++) { // Insert code here } // Test code for (i = 0; i < 3; i++) { if (parray[i] == &pointer[i]) { printf("Matched!\\n"); } else { printf("Fail\\n"); } } return 0; } ---END_INITIAL_CODE--- ---SOLUTION_CODE--- #include int main() { int intarray[5] = {10,20,30,40,50}; //-----------------------^ int *pointer = &intarray[2]; int *parray[3]; int i; for (i = 0; i < 3; i++) { parray[i] = pointer + i; } for (i = 0; i < 3; i++) { if (parray[i] == &pointer[i]) { printf("Matched!\\n"); } else { printf("Fail\\n"); } } return 0; } ---END_SOLUTION_CODE---