210 lines
6.5 KiB
Markdown
210 lines
6.5 KiB
Markdown
---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 <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 (--).
|
|
|
|
```c
|
|
#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:
|
|
|
|
```c
|
|
#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:
|
|
|
|
```c
|
|
#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--- |