POINTER
Pointer merupakan variabel yang digunakan untuk menyimpan data alamat suatu variabel lain
Cara penulisan deklarasinya seperti ini :
<var_name> *ptr_name;
Contoh penulisan deklarasinya seperti ini :
int *ptr_name;
char *ptr_name;
dll...
Pointer biasa memakai 2 operator berikut :
- & : untuk menampilkan alamat dari variabel
- * : untuk menampilkan konten dari variabel
Cara pemakaiannya seperti ini :
int nilai; //mendeklarasikan variabel nilai
int *ptr; //mendeklarasikan variabel pointer
ptr = &nilai; // 1
*ptr = 10; // 2
printf("%d", *ptr); // 3
1 = pointer ptr menunjuk ke variabel nilai melalui alamat variabel nilai
2 = variabel nilai yang sudah ditunjuk melalui pointer ptr dimasukkan angka 10
3 = ketika print *ptr, maka ditampilkan konten dari pointer ptr yaitu variabel nilai yang isinya 10.
POINTER TO POINTER
Pointer to pointer adalah variabel pointer yang gunanya untuk menyimpan alamat dari pointer lain
Contoh penulisan deklarasinya seperti ini :
int **ptr_name;
char ***ptr_name;
Penentuan jumlah '*' sesuai kebutuhan.
Jika pointer A menunjuk pointer B saja maka jumlah '*' untuk pointer A = 2
Jika pointer A menunjuk pointer B yang menunjuk pointer C maka jumlah '*' untuk pointer A = 3
Contoh penggunaannya :
int nilai;
int *ptr1;
int **ptr2;
int ***ptr3;
ptr1 = &nilai; // 1
ptr2 = &ptr1; // 2
ptr3 = &ptr2; // 3
***ptr3 = 21; // 4
printf("%d %d %d %d", nilai, *ptr1, **ptr2, ***ptr3); // 5
1 = pointer ptr1 menunjuk ke variabel nilai melalui alamat variabel nilai
2 = pointer ptr2 menunjuk ke pointer ptr1 melalui alamat ptr1
3 = pointer ptr3 menunjuk ke pointer ptr2 melalui alamat ptr2
4 = variabel nilai yang sudah ditunjuk melalui pointer ptr1 yang sudah ditunjuk melalui pointer ptr2 yang sudah ditunjuk melalui pointer ptr3 dimasukkan angka 21
5 = ketika print, maka ditampilkan konten dari semua pointer ptr yang isinya semua 21.
ptr1, ptr2, ptr3 bisa mengasilkan output yang sama-sama 21 karena ketiganya saling terhubung
ARRAY
Array merupakan kumpulan data berurutan yang bertipe sama
Cara penulisannya seperti ini :
<var_type>array_name[value_dim];
value_dim artinya value dimension, anggapannya merupakan jumlah slot yang disediakan oleh suatu array
Jika ingin menyediakan slot untuk 10 integer maka,
contoh penulisannya seperti ini :
int array_name [10];
Jadinya array_name akan terlihat seperti ini :
|_| |_| |_| |_| |_| |_| |_| |_| |_| |_|
0 1 2 3 4 5 6 7 8 9
slot-slot pada array tersebut dapat disebut juga dengan elemen
angka 0-9 merupakan index elemen dalam suatu array
index ini dapat diibaratkan sebagai nomor tiap slot dalam array
penomoran selalu mulai dari 0
untuk pengisian nilai dalam array tinggal dilakukan seperti ini:
contohnya kita ingin meletakkan angka 5 pada slot pertama
slot pertama mempunyai index 0
maka penulisannya seperti berikut:
array_name [0] = 5;
dengan begitu array_name akan terlihat seperti ini:
|5| |_| |_| |_| |_| |_| |_| |_| |_| |_|
0 1 2 3 4 5 6 7 8 9
jika ingin memanggil slot 1 pada array maka tinggal dilakukan seperti berikut:
printf ("%d", array_name [0] );
kita tinggal perlu mengisi kurung siku dengan index slot yang ingin kita panggil
kurung siku tersebut disebut juga dengan tempat mengisi dimensional value
selain itu, untuk memanggil array dapat menggunakan pointer
array dapat dianalogikan pointer konstan yang mununjuk pada elemen array pertama
maka *array_name = &array_name [0]
jika dipanggil maka akan keluar konten elemen pertama array
misalnya kita ingin memanggil array pada elemen ketiga yaitu index 2
kita hanya perlu menambah dengan 2 seperti berikut:
printf ("%d",*(array_name+2));
hasilnya akan sama saja ketika kita memanggil dengan format berikut
printf ("%d", array_name[2]);
kita dapat menginisialisasi array langsung dengan isi-isinya seperti berikut:
kita dapat menginisialisasi tanpa mengisi dimensional value:
int arr [ ] = {1,2,3,4,5};
kita juga dapat menginisialisasi dengan dimensional value:
int arr [6] = {1,2,3,4,5};
hati-hati, jika kita mengisi dimensional value lebih kecil dari jumlah elemen yang ingin kita masukkan angka seperti:
int arr [1] = {1,2,3,4,5,6,7,8,9,10};
dapat menyebabkan run-time error
untuk beberapa kasus, program masih tetap bisa berjalan tapi tetap saja bukanlah hal baik.
selain itu, ketika mengisi dimensional value, selalu biasakan tambahkan 1.
karena dalam array, ketika kita mengisi 5 angka, jumlah elemen dalam array tidaklah 5 melainkan 6 karena setiap akhir elemen dari array selalu ada 'end of string' arau '\0'.
maka ketika anda ingin mengisi 5 angka dalam array maka ubahlah dimensional valuenya menjadi 6
pointer ada dua macam
- pointer variabel : pointer yang bisa diisi dengan nilai baru
- pointer konstan : pointer yang tidak bisa diisi dengan nilai baru
array seperti yang sudah disebutkan sebelumnya merupakan pointer konstan
ketika pointer variabel diisi dengan alamat variabel A kemudian diganti dengan alamat variabel B masih bisa
tapi ketika pointer konstan, ambil saja contohnya array, ketika diisi dengan variabel baru misalnya A maka akan error
yang dijelaskan diatas merupakan array 1 dimensi, bagaimana dengan 2 dimensi?
ARRAY 2 DIMENSI
syntaxnya sebagai berikut:
<var_type> array_name [row][col];
contoh penulisannya seperti ini :
int array_name [4][4];
jumlah barisnya 4 dan jumlah kolomnya 4
jadi kelihatannya akan seperti ini:
col 1 col 2 col 3 col 4
row 1 |__| |__| |__| |__|
row 2 |__| |__| |__| |__|
row 3 |__| |__| |__| |__|
row 4 |__| |__| |__| |__|
ketika kita ingin memanggil nilai yang ada pada kolom pertama dan baris kedua maka tinggal menulis seperti ini:
printf ("%d", array_name [2][1]);
untuk inisialisasi array 2 dimensi dapat ditulis sebagai berikut:
int array_name [2][2] = { 1,2,3,4 };
ataupun seperti ini,
int array_name [2][2] = { (1,2), (3,4) };
hasilnya nanti sama saja yaitu,
baris 1 kolom 1 = 1
baris 1 kolom 2 = 2
baris 2 kolom 1 = 3
baris 2 kolom 2 = 4
Selain itu ada juga array 3 dimensi, seperti 2 dimensi hanya saja ada dimensi tambahan yaitu kedalamannya
jadi ketika array 2 dimensi seperti ini:
int arr[2][2] = {1,2,3,4};
maka ketika ditambahkan dimensi ketiga yaitu kedalamannya seperti ini
int arr[2][2][2];
maka deklarasinya akan terlihat seperti ini:
int arr[2][2][2] = {(1,2),(3,4),(5,6),(7,8)};
array juga dapat diisi dengan pointer
jadi syntaxnya akan seperti ini:
<var_type> *array_ptr [value_dim];
array juga dapat diisi oleh character
biasa digunakan sebagai string
contohnya seperti berikut :
char arr [6] = {'H','E','L','L','O'};
printf ("%s", arr); //output : HELLO
char arr2 [50];
scanf ("%s", arr2); //input : HAISEMUAPENGUNJUNG
printf ("%s", arr2); //output : HAISEMUAPENGUNJUNG
ada library yang menyediakan function untuk memanipulasi string
nama headernya : string.h
beberapa nama fungsinya sebagai berikut :
- strlen() : return nilai yang isinya panjang string
- strcpy (s1,s2) : menyalin s2 ke s1
- strcpy (s1,s2,n) : menyalin n karakter pertama dari s2 ke s1
- strcat (s1,s2) : menambahkan s2 ke akhir dari s1
- strcat (s1,s2,n) : menambahkan n karakter s2 ke akhir dari s1
- strcmp (s1,s2) : mengompare nilai dari string 1 dan string 2, jika sama maka return 0
Selasa, 23 Oktober 2018
Kamis, 11 Oktober 2018
LOOPING DALAM BAHASA C
Dalam koding, looping/repetisi salah satu proses penting yang seringkali dipakai untuk mempermudah suatu pengerjaan yang membutuhkan pengulangan.
Contohnya seperti saat kita ingin print kata 'hello world' sebanyak 10 kali.
Tidak mungkin kalau kita harus membuat 10 baris 'printf ("hello world")'. Itu sangat melelahkan.
Untuk itu, kita perlu memakai looping.
Dengan looping kita hanya butuh sedikit baris dan tentunya tidak melelahkan.
Dalam bahasa C, looping dibagi menjadi 3 yaitu
- for
- while
- do while
1. FOR
Format FOR adalah sebagai berikut:
for ( inisialisasi ; kondisi ; increment/decrement ) {
statement1;
statement2;
.....
}
Bagian inisialisasi, kondisi, dan increment/decrement tersebut bersifat optional, artinya salah satu bisa dihilangkan (sesuai kebutuhan).
Setiap bagian dapat diisi lebih dari 1 ekspresi tapi harus dipisahkan dengan koma. Contohnya :
int i, j;
for ( i=10, j=0 ; i > j ; i--, j++ ){
printf ("*");
}
Contoh lain dari FOR untuk menampilkan angka 1 - 10 :
int i;
for ( i=1 ; i <= 10 ; i++ ) {
printf ("%d" , i ); // Output : 12345678910
}
Ada juga yang namanya infinite loop. Infinite loop merupakan proses looping yang tidak memiliki batas sehingga prosesnya terus berulang selamanya. Contohnya :
int i;
for ( ; 1 ; ) {
printf ("@"); // akan menampilkan '@' terus menerus
}
Selain itu, ada yang namanya nested loop. Nested loop artinya loop di dalam loop. Loop yang didalam akan mengulang lebih dulu daripada loop yang diluar. Contohnya :
int i,j;
for ( i=1 ; i <=3 ; i++ ){
for ( j=1 ; j <= 5 ; j++ ){
printf ("%d", j );
}
printf (" %d " , i );
}
// Output : 12345 1 12345 2 12345 3
2. WHILE
Format WHILE adalah sebagai berikut:
while ( ekspresi/kondisi ) {
statement1;
statement2;
......
}
Ekspresi dalam while merupakan ekspresi boolean. Ketika TRUE maka statement didalam akan tereksekusi, jika FALSE maka tak akan dieksekusi.
Saat ekspresi diisi angka 0 maka otomatis kondisinya FALSE.
Saat ekspresi bukan angka 0 (seperti angka 1 atau diatasnya ) maka kondisinya TRUE
Pada looping menggunakan WHILE, ekspresi/kondisi akan dicek terlebih dahulu baru menjalankan statement. Akan berbeda halnya dengan DO...WHILE.
Contoh dari looping menggunakan WHILE untuk menampilkan angka 1 sampai 5
int i = 1;
while ( i <= 5 ){
printf ("%d", i ); // Output : 12345
i++;
}
3. DO.. WHILE
Format DO.. WHILE adalah sebagai berikut:
do {
statement1;
statement2;
....
}
while ( kondisi/ekspresi );
Kondisi DO.. WHILE berbeda dengan kondisi WHILE. Kalau WHILE akan ngecek kondisi dulu baru statementnya di eksekusi, jadi kalau false tidak akan ada statement yang tereksekusi. Sementara DO.. WHILE akan mengeksekusi statement dulu baru mengecek kondisi. Jadi walaupun kondisinya false, ia tetap akan menjalankan statement paling tidak satu kali.
Contoh dari DO.. WHILE sebagai berikut :
int i = 0;
do {
printf ("%d" , i ); // Output : 012345
i++;
}
while ( i < 6 );
int j = 5;
do {
printf ("%d", j ); // Output : 5
j++;
}
while ( j < 5 );
Dalam loop, ada yang namanya BREAK. BREAK digunakan untuk keluar dari loop. Contohnya :
int i = 0;
while ( i < 100 ) {
if ( i > 4 ) {
break;
}
else {
printf ("%d", i );
i++;
}
}
Output diatas akan menghasilkan angka '01234' karena ketika i = 5 maka ia akan memasuki kondisi if ( i > 4 ) dan melakukan break sehingga otomatis langsung keluar dari loop dan tidak lagi melanjutkan pengulangan.
Selain itu, BREAK juga digunakan untuk mengakhiri operasi case dalam switch. Kalau tidak ada BREAK, operasi case akan berjalan terus dari awal case hingga akhir case. Contohnya :
int i = 5;
switch (i) {
case 5 : printf ("hello"); break;
case 6 : printf ("world"); break;
}
// Output : hello
Kalau tidak ada break, maka outputnya akan menjadi "hello world" karena setelah melakukan case 5, tidak akan keluar dari switch, melainkan tetap berjalan ke case dibawahnya yaitu case 6 sehingga case 6 juga ikutan ter-print
Dalam loop juga ada CONTINUE. CONTINUE digunakan untuk skip statement. Jadinya statement itu tidak akan dihiraukan dan akan melanjutkan ke counter berikutnya. Contohnya :
int i;
for ( i=1; i <= 10; i++) {
if ( i == 5 ) {
continue;
printf ("hello");
}
printf ("%d", i);
}
Output contoh diatas akan menampilkan angka '1234678910' karena ketika i = 5 maka ia masuk ke kondisi if ( i == 5 ) dan melakukan continue. Ia tidak peduli lagi dengan statement yang ada dibawahnya dan akan melanjutkan ke counter berikutnya.