sinau-c/content/pointer_arithmetics.md

6.5 KiB

---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:

#include <stdio.h>

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 (--).

#include <stdio.h>

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:

#include <stdio.h>

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:

#include <stdio.h>

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 <stdio.h>

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 <stdio.h>

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---