1
ARRAY & POINTER Listing 8.1. EXPENSES.C demonstrates the use of an array. 1: /* EXPENSES.C - Demonstrates use of an array */ 2: 3: #include <stdio.h> 4: 5: /* Declare an array to hold expenses, and a counter variable */ 6: 7: float expenses[13]; 8: int count; 9: 10: main() 11: { 12: /* Input data from keyboard into array */ 13: 14: for (count = 1; count < 13; count++) 15: { 16: printf("Enter expenses for month %d: ", count); 17: scanf("%f", &expenses[count]); 18: } 19: 20: /* Print array contents */ 21: 22: for (count = 1; count < 13; count++) 23: { 24: printf("Month %d = $%.2f\n", count, expenses[count]); 25: } 26: return 0; 27: } Enter expenses for month 1: 100 Enter expenses for month 2: 200.12 Enter expenses for month 3: 150.50 Enter expenses for month 4: 300 Enter expenses for month 5: 100.50 Enter expenses for month 6: 34.25 Enter expenses for month 7: 45.75 Enter expenses for month 8: 195.00 Enter expenses for month 9: 123.45 Enter expenses for month 10: 111.11 Enter expenses for month 11: 222.20 Enter expenses for month 12: 120.00 Month 1 = $100.00 Month 2 = $200.12 Month 3 = $150.50 Month 4 = $300.00 Month 5 = $100.50 Month 6 = $34.25 Month 7 = $45.75 Month 8 = $195.00 Month 9 = $123.45 Month 10 = $111.11 Month 11 = $222.20 Month 12 = $120.00
AP3: Array & Pointer
2
Listing 8.3. RANDOM.C creates a multidimensional array. 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44:
/* RANDOM.C - Demonstrates using a multidimensional array */ #include <stdio.h> #include <stdlib.h> /* Declare a three-dimensional array with 1000 elements */ int random_array[10][10][10]; int a, b, c; main() { /* Fill the array with random numbers. The C library */ /* function rand() returns a random number. Use one */ /* for loop for each array subscript. */ for (a = 0; a < 10; a++) { for (b = 0; b < 10; b++) { for (c = 0; c < 10; c++) { random_array[a][b][c] = rand(); } } } /* Now display the array elements 10 at a time */ for (a = 0; a < 10; a++) { for (b = 0; b < 10; b++) { for (c = 0; c < 10; c++) { printf("\nrandom_array[%d][%d][%d] = ", a, b, c); printf("%d", random_array[a][b][c]); } printf("\nPress Enter to continue, CTRL-C to quit."); getchar(); } }
} return 0; /* end of main() */
random_array[0][0][0] = 346 random_array[0][0][1] = 130 random_array[0][0][2] = 10982 random_array[0][0][3] = 1090 random_array[0][0][4] = 11656 random_array[0][0][5] = 7117 random_array[0][0][6] = 17595 random_array[0][0][7] = 6415 random_array[0][0][8] = 22948 random_array[0][0][9] = 31126 Press Enter to continue, CTRL-C to quit. random_array[0][1][0] = 9004 random_array[0][1][1] = 14558 random_array[0][1][2] = 3571 random_array[0][1][3] = 22879 random_array[0][1][4] = 18492 random_array[0][1][5] = 1360 random_array[0][1][6] = 5412 random_array[0][1][7] = 26721 random_array[0][1][8] = 22463 random_array[0][1][9] = 25047 Press Enter to continue, CTRL-C to quit ... ... random_array[9][8][0] = 6287 random_array[9][8][1] = 26957
random_array[9][8][2] = 1530 random_array[9][8][3] = 14171 random_array[9][8][4] = 6951 random_array[9][8][5] = 213 random_array[9][8][6] = 14003 random_array[9][8][7] = 29736 random_array[9][8][8] = 15028 random_array[9][8][9] = 18968 Press Enter to continue, CTRL-C to quit. random_array[9][9][0] = 28559 random_array[9][9][1] = 5268 random_array[9][9][2] = 20182 random_array[9][9][3] = 3633 random_array[9][9][4] = 24779 random_array[9][9][5] = 3024 random_array[9][9][6] = 10853 random_array[9][9][7] = 28205 random_array[9][9][8] = 8930 random_array[9][9][9] = 2873 Press Enter to continue, CTRL-C to quit.
AP3: Array & Pointer
1
Suatu Pointer (variabel penunjuk) adalah suatu variabel yang berisi dengan alamat lokasi suatu memori tertentu. Bahasa C menyediakan 2 buah operator untuk operasi pointer yaitu: operator ‘*’, dan operator ‘&’. Operator Alamat (Address operator (&)) Pada saat pendeklarasian variable, user tidak diharuskan menentukan lokasi sesungguhnya pada memory, hal ini akan dilakukan secara otomatis oleh compiler dan operating sysem pada saat runtime. Jika ingin mengetahui lokasi dimana suatu variable disimpan, dapat dilakukan dengan memberikan tanda ampersand (&) didepan variable , yang berarti "address of". Contoh: ted = &andy; Akan memberikan kepada variable ted alamat dari variable andy, karena variable andy diberi awalan karakter ampersand (&), maka yang menjadi pokok disini adalah alamat dalam memory, bukan isi variable. Misalkan andy diletakkan pada alamat 1776 kemudian dituliskan instruksi sbb : andy = 25; fred = andy; ted = &andy; Maka hasilnya:
Operator Reference (*) Dengan menggunakan pointer, kita dapat mengakses nilai yang tersimpan secara langsung dengan memberikan awalan operator asterisk (*) pada identifier pointer, yang berarti "value pointed by". Contoh: beth = *ted; (dapat dikatakan:"beth sama dengan nilai yang ditunjuk oleh ted") beth = 25, karena ted dialamat 1776, dan nilai yang berada pada alamat 1776 adalah 25.
AP3 – Week 11: Pointer
2
Ekspresi dibawah ini semuanya benar, perhatikan: andy == 25 &andy == 1776 ted == 1776 *ted == 25 1. Ekspresi pertama merupakan assignation bahwa andy=25;. 2. Kedua, menggunakan operator alamat (address/derefence operator (&)), sehingga akan mengembalikan alamat dari variabel andy. 3. Ketiga bernilai benar karena assignation untuk ted adalah ted = &andy;. 4. Keempat menggunakan reference operator (*) yang berarti nilai yang ada pada alamat yang ditunjuk oleh ted, yaitu 25. Maka ekspresi dibawah ini pun akan bernilai benar : *ted == andy Contoh: #include <stdio.h> int main () { int value1 = 5, value2 = 15; int * mypointer; mypointer = &value1; ------------> memiliki alamat yang sama dengan value1 *mypointer = 10; ------------> isi dari value1 dirubah mypointer = &value2; *mypointer = 20; printf (“value1== %d \n", value1); printf (“value2== %d “, value2); return 0; } Output: value1==10 value2==20
<-------------- Isi dari value1 setelah dirubah <-------------- Isi dari value2 setelah dirubah
AP3 – Week 11: Pointer
3
Deklarasi Pointer Variabel pointer dideklarasikan dengan nama variabelnya ditulis dengan diawali karakter asterik. Bentuk umum: Tipe-data *nama-variabel-pointer; Variabel pointer yang dideklarasikan dapat juga langsung diberikan nilai awal. Variabel pointer harus dideklarasikan dengan tipe yang sesuai dengan tipe data di memori yang ditunjuknya. Misalnya data yang ada dimemori bertipe float(4 byte) dan variabel pointer yang menunjukkan kealamat ini adalah bertipe int(2 byte), maka hanya 2 byte pertama saja yang akan diambil dengan hasil yang tidak sesuai dengan yang diharapkan.
Array dan Pointer Identifier (nama pengenal) suatu array equivalen dengan alamat dari elemen pertama, pointer equivalen dengan alamat elemen pertama yang ditunjuk. Perhatikan deklarasi berikut: int numbers [20]; int * p; maka deklarasi dibawah ini juga benar : p = numbers; p dan numbers adalah equivalen, dan memiliki sifat (properties) yang sama. Perbedaannya, user dapat menentukan nilai lain untuk pointer p dimana numbers akan selalu menunjuk nilai yang sama seperti yang telah didefinisikan. Dimana p, merupakan variable pointer, numbers adalah constant pointer. Karena itu walaupun instruksi diatas benar, tetapi tidak untuk instruksi dibawah ini: numbers = p; karena numbers adalah array (constant pointer), dan tidak ada nilai yang dapat diberikan untuk identifier konstant (constant identifiers). Contoh: #include <stdio.h> int main () { int numbers[5]; int * p; p = numbers; *p = 10; p++; *p = 20; p = &numbers[2]; *p = 30; p = numbers + 3; *p = 40; p = numbers; *(p+4) = 50; for (int n=0; n<5; n++) printf (“%d, “, numbers*n+); return 0; } Output: 10, 20, 30, 40, 50,
AP3 – Week 11: Pointer