Pointers: &, *, and pass-by-pointer · Pointer: &, *, dan pass-by-pointer
A problem from last lesson
- Last lesson, a function got a copy of your number. Changing the copy did not change the original.
- C copies every argument you pass to a function. So a normal function cannot change your variable.
- To change it, the function needs the variable's address — where it lives in memory.
Masalah dari pelajaran sebelumnya
- Pada pelajaran sebelumnya, fungsi mendapatkan salinan dari angka Anda. Mengubah salinan tersebut tidak mengubah nilai asli.
- C menyalin setiap argumen yang Anda teruskan ke fungsi. Jadi fungsi biasa tidak dapat mengubah variabel Anda.
- Untuk mengubahnya, fungsi memerlukan alamat variabel tersebut — di mana ia berada dalam memori.
Every variable has an address
- Think of a variable as a box in memory. The value is kept inside the box.
- Every box has an address: a number that says where the box is.
- The
&operator gives you that address.&xmeans "the address ofx".
Setiap variabel memiliki alamat
- Bayangkan variabel sebagai kotak dalam memori. Nilainya disimpan di dalam kotak tersebut.
- Setiap kotak memiliki alamat: sebuah angka yang menunjukkan di mana kotak itu berada.
- Operator
&memberikan Anda alamat tersebut.&xberarti "alamat darix".
A pointer holds an address
- A pointer is a variable that stores an address, not a normal value.
- You declare one with a
*:int *p = &x;reads as "ppoints tox". - To reach the value at that address, put
*in front:*p. This is called dereference. - Changing
*pchanges the original variable.*p = 5;puts5intoxitself.
Penunjuk menyimpan alamat
- Penunjuk (pointer) adalah variabel yang menyimpan alamat, bukan nilai biasa.
- Anda mendeklarasikannya dengan
*:int *p = &x;dibaca sebagai "pmenunjuk kex". - Untuk mencapai nilai di alamat tersebut, letakkan
*di depannya:*p. Ini disebut dereference. - Mengubah
*pmengubah variabel asli.*p = 5;memasukkan5langsung ke dalamx.
#include <stdio.h>
void set_to_five(int *p) {
*p = 5; // change the value at the address
}
int main(void) {
int x = 0;
set_to_five(&x); // pass the ADDRESS of x
printf("%d\n", x); // 5 — the original changed!
return 0;
}
Out-pointers: giving back more than one answer
- A function can
returnonly one value. But it can change several variables through pointers. - You pass the address of each answer, like
find(&min, &max). The function writes into them with*. - These extra pointer parameters are called out-pointers. The caller reads the answers after the call.
- A pointer that points to nothing is
NULL. Never dereference aNULLpointer.
Out-pointers: mengembalikan lebih dari satu jawaban
- Fungsi hanya dapat
returnsatu nilai. Namun ia dapat mengubah beberapa variabel melalui penunjuk. - Anda teruskan alamat dari setiap jawaban, seperti
find(&min, &max). Fungsi menulis ke dalamnya menggunakan*. - Parameter penunjuk tambahan ini disebut out-pointers. Pemanggil membaca jawabannya setelah pemanggilan.
- Penunjuk yang tidak menunjuk ke apa pun adalah
NULL. Jangan pernah dereferensikan pointerNULL.
Common mistakes
&xis the address ofx;*pis the value stored atp.- Never use
*pon an uninitialised orNULLpointer.
Kesalahan umum
&xadalah alamat darix;*padalah nilai yang disimpan dip.- Jangan pernah gunakan
*ppada penunjuk yang belum diinisialisasi atauNULL.
Now you try
- Each task gives you a function to complete. Use
*to read or change the value the pointer points to. - When a value comes in through a pointer (like
int *p), write your answer through it — do notreturnit. - Do not write a
main— the checker provides one. Press Run, then Check answer.
Sekarang Anda coba
- Setiap tugas memberikan Anda fungsi untuk diselesaikan. Gunakan
*untuk membaca atau mengubah nilai yang ditunjuk oleh penunjuk. - Ketika sebuah nilai masuk melalui pointer (seperti
int *p), tuliskan jawaban Anda melalui pointer tersebut — janganreturnnya. - Jangan tulis
main— checker menyediakan satu. Tekan Run, lalu Check answer.
Complete void add_one(int *p) so it adds 1 to the int that p points at. Use *p. Do not write a main — the checker provides one. · Lengkapi void add_one(int *p) agar menambahkan 1 ke int yang ditunjuk oleh p. Gunakan *p. Jangan tulis main — pengecek menyediakannya.
Click Run to see the output here. · Klik Jalankan untuk melihat output di sini.
Complete void swap(int *a, int *b) so it exchanges the two ints. Use a temporary variable. Do not write a main. · Lengkapi void swap(int *a, int *b) agar menukar dua int tersebut. Gunakan variabel sementara. Jangan tulis main.
Click Run to see the output here. · Klik Jalankan untuk melihat output di sini.
Complete void min_max(const int a[], int n, int *min_out, int *max_out). Scan the array, then write the smallest value through min_out and the largest through max_out. Assume n >= 1. Do not write a main. · Lengkapi void min_max(const int a[], int n, int *min_out, int *max_out). Scan array, lalu tulis nilai terkecil melalui min_out dan nilai terbesar melalui max_out. Asumsikan n >= 1. Jangan tulis main.
Click Run to see the output here. · Klik Jalankan untuk melihat output di sini.