Menyerang pointer di C (Bagian 1)
Petunjuk 101
Saya ingat belajar pemrograman C dengan teman-teman saya dan perasaan gembira yang kami rasakan sampai guru kami menyebutkan petunjuknya. Itu adalah sebuah tantangan, tetapi menyenangkan bagi saya untuk memahami konsep yang begitu penting.
Pointer bisa dibilang salah satu konsep tersulit dalam bahasa C, tetapi sangat penting jika Anda ingin menjadi pemrogram C yang mahir. Bahkan jika kita tidak menyadarinya, pointer ada di sekitar kita di hampir setiap kode yang kita tulis, baik secara eksplisit maupun implisit.
Pada artikel ini, kita akan menjelajahi berbagai skenario penggunaan pointer — berfokus pada yang paling umum. Jadi tarik napas dalam-dalam dan mari kita mulai!
Sebelum membaca posting ini, pastikan Anda sudah familiar dengan pengertian yang paling dasar dari bahasa C : Variabel dan jenis, kondisi, loop dan fungsi. Di bagian pertama seri ini, berikut adalah konsep yang akan kita bahas melalui pointer dan representasi memori, deklarasi dan pernyataan pointer; alamat dan aritmatika pointer, tipe casting dan operator dereferensi.
Memori Komputer
Dulu, Pointer dan Programmer adalah satu dan sama. Mereka menciptakan segala macam hal bersama-sama. Tanpa kemitraan mereka, tidak ada yang akan dibuat. Jadi apa yang kamu katakan … kenapa kita tidak retak ?! Maaf, jangan bosan
Ayo serius sekarang!
Untuk memahami pointer dan operasi yang dapat dilakukan dengannya, kita perlu belajar sedikit tentang memori komputer dan bagaimana variabel ditempatkan dan direpresentasikan di dalamnya. Komputer dapat memiliki banyak gigabytes memori. Setiap byte memori memiliki alamat yang unik. Kita dapat menganggap memori utama atau RAM sebagai array besar byte dan alamat sebagai indeks dari setiap elemen array atau byte dalam array. Kebanyakan variabel disimpan dalam array (yaitu, dalam memori utama) lebih besar dari satu byte, sehingga alamat dari setiap variabel adalah indeks dari byte pertama dari variabel tersebut.
Anda dapat melihat di atas tipe data primitif umum dan ukurannya yang dapat diperoleh dengan sizeofoperator dalam bahasa C. Mantan:sizeof(int)
Memori utama (RAM), dapat divisualisasikan sebagai array byte yang berdekatan. Alamat setara dengan indeks ke dalam array memori. Sebagian besar tipe data menjangkau beberapa byte memori (mis: pada gambar pertama, float mencakup 4 byte dan char mencakup 1 byte). Alamat dari variabel multi-byte adalah alamat atau indeks array dari byte pertamanya.
Anda dapat menganggap variabel sebagai rumah dan alamat sebagai kunci untuk mengakses konten rumah. Isi rumah (mungkin penghuni atau apa saja yang ada di dalamnya) bisa berubah. Dan siapapun yang memiliki kunci rumah, dapat mengakses dan mengubah isinya.
Variabel pertama bertipe int, sehingga mencakup 4 byte dan alamatnya adalah indeks dari byte pertama (0). Yang kedua adalah tipe char (rentang 1 byte) dan kemudian memiliki alamat 4 karena yang pertama mencakup empat byte pertama dihitung dari 0 sampai n-1 (0, 1, 2, 3).
Catatan: Alamat variabel di memori utama sering ditulis dalam heksadesimal (mis: 0xFA44dE). Kami menggunakan bilangan bulat di sini (0, 1, …) untuk menyederhanakan notasi. Saat Anda mendeklarasikan variabel x dan variabel y , keduanya bertipe sama atau berbeda, x dapat disimpan di alamat 8 dan y di alamat 465792. Tidak dikatakan bahwa variabel Anda harus disimpan di alamat yang berurutan . Program Anda memeriksa alamat gratis dan tersedia sebelum menyimpan variabel Anda di memori. Jadi, jika alamat tidak tersedia atau tidak dapat menyimpan data, itu adalah tanggung jawab program atau OS Anda (apa pun), untuk menyimpan variabel Anda di alamat yang sesuai.
Dalam praktiknya, saat Anda mendeklarasikan variabel dan memberinya nilai, variabel ini disimpan di alamat dengan nilai yang diberikan. Mari kita lihat contoh ini:
Jika karena alasan apa pun, Anda tidak dapat membuka tautan di atas, berikut adalah kode di kotak pasir:
/*
* Auth: Arsene Awounou
* File: main.c
*/
#include <stdio.h>
/**
* main - entry point
*
* Return: always 0
*/
int main(void) {
/* declare variables and initialize them*/
int a = 4;
int b = 17;
char c = 'c';
/* print the above variables */
printf("%d %d %c\n", a, b, c);
return 0;
}
Pointer
Apa itu pointer di C?
Dalam bahasa pemrograman C, pointer adalah variabel yang menyimpan alamat dari variabel lain. Really ? Ya, sungguh. Tahu apa artinya ini? Ini berarti bahwa pointer memiliki properti yang sama dengan variabel normal tetapi dengan kekhasan menyimpan alamat variabel lain. Oleh karena itu, sebuah pointer dicirikan oleh namanya, tipenya (variabel yang alamatnya dikandungnya) dan alamatnya sendiri. Ya, kami mengatakan bahwa pointer juga merupakan variabel, sehingga mewarisi semua properti variabel.
Bagaimana cara mendapatkan alamat suatu variabel?
Kami baru saja mengatakan bahwa pointer seharusnya menyimpan alamat variabel. Karenanya kita perlu tahu bagaimana cara mendapatkan alamat tersebut, bukan? Untuk melakukannya, kami menggunakan tanda ampersand & . Lihatlah kode berikut:
Jika karena alasan apa pun, Anda tidak dapat membuka tautan di atas, berikut adalah kode di kotak pasir:
/*
* Auth: Arsene Awounou
* File: main.c
*/
#include <stdio.h>
/**
* main - entry point
*
* Return: always 0
*/
int main(void) {
/* declare variables and initialize them*/
int a = 4;
int b = 17;
char c = 'c';
/* print the above variables */
printf("Address of a is : %p\n", &a);
printf("Address of b is : %p\n", &b);
printf("Address of c is : %p\n", &c);
return 0;
}
Catatan : Jika Anda menjalankan kode yang sama pada mesin Anda, Anda mungkin mendapatkan keluaran lain . Ingat, saya memberi tahu Anda bahwa alamat variabel Anda dipilih oleh OS Anda sesuai dengan ketersediaannya. Jadi, di mesin saya, alamat/lokasi 0x7ffcc4b574c8 , 0x7ffcc4b574c4 dan 0x7ffcc4b574c3 tersedia untuk menyimpan variabel saya.
Jadi, untuk mendapatkan alamat dari variabel yang diberikan var , kita menggunakan &var. Hei sobat, ya kamu membaca! Bukankah ini mengingatkan Anda pada sesuatu yang akrab? Saya cukup yakin Anda pernah menulis sesuatu seperti ini sebelumnya: scanf("%d", &var);Bukan?
Kami mengirimkan alamat variabel ke fungsi scanf sehingga dapat langsung mengubah nilainya. Ingatlah hal ini:
Variabel dapat dibandingkan dengan rumah dan alamat seperti kunci yang menyediakan akses ke konten di dalamnya. Konten ini dapat berubah (seperti saat kami mengubah tempat furnitur, atau mengecat ulang), dan siapa pun yang memegang kunci memiliki akses serta kontrol atasnya.
Bagaimana cara mendeklarasikan Variabel Pointer C?
Cara umum untuk mendeklarasikan pointer adalah:
datatype* pointer_name;
datatype* pointer_name;
/* or */
datatype * pointer_name;
int* test, test_1; // example 1
int * test, test_1; // example 2
int *test, test_1; // example 3
int *test, *test_1, *test_2; // and so on
Inisialisasi pointer adalah proses menetapkan alamat variabel ke pointer:
int a = 17;
int *pointer_to_a = &a; /* declaration + initialization */
int a = 17;
int *pointer_to_a; // declaration
pointer_to_a = &a; // initialization
char c = 'A';
int *pointer_to_c = &c; // mismatching types
Operator dereferensi *
Operator dereferensi , juga disebut operator tipuan , dilambangkan dengan * dalam bahasa C, adalah operator unary (yaitu satu dengan operan tunggal) yang menyertakan variabel penunjuk. Ini beroperasi pada variabel penunjuk, dan mengembalikan dan l-valuesetara dengan nilai di alamat penunjuk. Ini disebut dereferensi penunjuk . Perhatikan contoh berikut untuk pemahaman yang lebih baik:
Jika karena alasan apa pun, Anda tidak dapat membuka tautan di atas, berikut adalah kode di kotak pasir:
/*
* Auth: Arsene Awounou
* File: main.c
*/
#include <stdio.h>
/**
* main - entry point
*
* Return: always 0
*/
int main(void) {
int var = 17;
int *ptr = &var; // assign ptr the address of var
/* we can print the value of var in three different ways */
printf("Value of var is : %d\n", var);
printf("Value of var is : %d\n", *ptr);
printf("Value of var is : %d\n", *(&var));
/* we can print the address of var in two different ways */
printf("Address of var is : %p\n", &var);
printf("Address of var is : %p\n", ptr);
/* we can print the address of ptr in this way */
printf("Address of ptr is : %p\n", &ptr);
return 0;
}
Penjelasan :
ptradalah penunjuk yang menunjuk ke variabel var (ptr menyimpan alamat variabel tersebut :int *ptr = &var;);- Ekspresi
*ptr,vardan*(&var)artinya sama : mereka digunakan untuk mendapatkan nilai yang disimpan dalam variabelvar.
- Saat mendeklarasikan variabel pointer, * menunjukkan bahwa variabel tersebut adalah pointer ;
- Kita bisa mendapatkan alamat variabel dengan menggunakan ampersand & (ex: &var) ;
- Deklarasi
int *ptrberarti bahwa ptr akan menyimpan alamat variabel yang bertipe integer (menyimpan nilai integer); - Untuk mengakses nilai pada alamat tertentu, * digunakan. Dan * dapat dibaca sebagai 'nilai pada' (*ptr artinya nilai pada ptr).
Untuk memastikan lingkungan yang aman, penting untuk menetapkan nilai NULL ke variabel penunjuk jika Anda tidak memiliki alamat yang tepat. Ini harus dilakukan ketika variabel dideklarasikan untuk membuat apa yang dikenal sebagai penunjuk nol.
Pointer NULL adalah konstanta dengan nilai nol yang ditentukan di beberapa pustaka standar.
#include <stdio.h>
int main () {
int *pointer = NULL;
printf("Value of pointer: %x\n", pointer); // 0
return 0;
}
Memverifikasi keberadaan penunjuk nol dapat dilakukan dengan pernyataan 'jika' dengan cara berikut:
if(pointer) /* instructions run if pointer is not null */
if(!pointer) /* instructions run if pointer is null */
Terima kasih telah membaca.
Anda dapat dengan bebas menghubungi saya di Twitter , LinkedIn , WhatsApp atau Telegram .

![Apa itu Linked List? [Bagian 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































