1031201 – Algoritma dan Struktur Data Minggu 01 Sesi 1,2,3 Goklas Henry Agus Panjaitan Topik Pengenalan Mata Kuliah Address vs Value Pointer Tahapan Hidup Pointer Parameter Passing Array Jenis Pointer 2/7/2022 ALSRUDAT/W01S1 2 Pengenalan Mata Kuliah • cis.del.ac.id: • Silabus • Jadwal mingguan: materi kuliah • Pengumuman • Beberapa himbauan: • • • • Aktif bertanya atau memberikan pendapat di kelas. Sudah berada di kelas sebelum kelas dimulai. Bersikap jujur saat mengerjakan tugas/ujian. Mempersiapkan diri dengan baik sebelum kelas dimulai: membaca materi di cis, membaca sumber-sumber lain terkait topik yang akan diberikan. • Tidak boleh menggunakan Handphone saat jam teori dan praktikum • HARUS selalu membawa pensil, rautan pensil, penghapus. • Semua setoran (tulis tangan) ditulis menggunakan pensil/pulpen yang dapat dihapus, kecuali untuk penulisan identitas mahasiswa dan tandatangan. • NO TYPEX 2/7/2022 ALSRUDAT/W01S1 3 Address vs Value • Setiap variabel memiliki address (alamat) dan value (isi) • Address sebuah variabel merepresentasikan lokasi disimpannya value (isi) sebuah variabel pada memori komputer • Value merupakan sebuah nilai spesifik yang disimpan oleh variabel 2/7/2022 ALSRUDAT/W01S1 4 Pointer • Pointer adalah variabel yang berisi address (alamat) dari variabel lain. pointer thing_ptr menyimpan alamat variabel thing 2/7/2022 ALSRUDAT/W01S1 5 Operator Pointer 2/7/2022 Operator * (dereference) Fungsi mengakses isi alamat yang ditunjuk oleh pointer & (address of) memberikan alamat dari sebuah variabel ALSRUDAT/W01S1 6 Deklarasi Pointer <tipe> * <nama> 2/7/2022 Deklarasi Deskripsi int *ptrInt; ptrInt adalah sebuah pointer ke integer char *ptrChar; ptrChar adalah sebuah pointer ke karakter float *ptrFloat; ptrFloat adalah sebuah pointer ke float double *ptrDouble; ptrDouble adalah sebuah pointer ke double TabInt *ptrTabInt; ptrTabInt adalah sebuah pointer ke tipe bentukan TabInt (ADT Tabel Integer) void *ptr; ptr adalah sebuah pointer generik (pointer to void) ALSRUDAT/W01S1 7 Inisialisasi • Saat dideklarasi, pointer belum menunjuk ke sebuah alamat tertentu • i.e. pointer hanya akan berisi sebuah alamat acak (tak-tentu) • Pointer dapat diinisialisasi dengan memberi nilai berupa alamat variabel yang sudah ada atau dengan melakukan pemesanan tempat baru di memori (alokasi). • Contoh: int *ptrInt = &x; int *ptrInt = malloc(sizeof (int)); 2/7/2022 /* x: integer */ /* alokasi */ ALSRUDAT/W01S1 8 Alokasi • Memesan tempat di memori • void *malloc (size_t size); • mengalokasikan sebanyak size byte memori • jika gagal, mengembalikan NULL • Contoh int *ptrInt = malloc (sizeof (int)); • mengalokasikan sebuah integer di memori yang lokasinya disimpan dalam variabel ptrInt 2/7/2022 ALSRUDAT/W01S1 9 NULL Pointer • Tidak menunjuk ke mana pun (points to nothing) • Ekivalen dengan nilai numerik nol (0) • Didefinisikan pada stdlib.h dan stddef.h 2/7/2022 ALSRUDAT/W01S1 10 Contoh Penggunaan • Parameter Passing • Array Dinamis 2/7/2022 ALSRUDAT/W01S1 11 Dealokasi • Memori yang dipesan dengan malloc harus dibebaskan setelah selesai dipergunakan • void free(void *pointer); 2/7/2022 ALSRUDAT/W01S1 12 Example 2/7/2022 ALSRUDAT/W01S1 13 Explanation of Examples 1. Now the assignments x = 1 and y = 2 obviously load these values into the variables. ip is declared to be a pointer to an integer and is assigned to the address of x (&x). So ip gets loaded with the value 100. 2. Next y gets assigned to the contents of ip. In this example ip currently points to memory location 100 -- the location of x. So y gets assigned to the values of x -- which is 1. 3. We have already seen that C is not too fussy about assigning values of different type. Thus it is perfectly legal (although not all that common) to assign the current value of ip to x. The value of ip at this instant is 100. 4. Finally we can assign a value to the contents of a pointer (*ip). 2/7/2022 ALSRUDAT/W01S1 14 Array • Sebuah array diperlakukan sebagai pointer ke elemen pertama dari array. • Array of <type> ekivalen dengan pointer to <type> • xxx[i] ekivalen dengan *(xxx + i) Catatan: • Array of <type> tidak identik dengan pointer to <type>. Array dan pointer tetap merupakan 2 buah tipe yang berbeda. Jika kita mempunyai array of <type> a dan pointer to <type> pa, kita bisa melakukan assignment pa = a, tapi tidak sebaliknya. • Perhatikan bahwa ptr + n (penambahan sebuah integer n ke sebuah pointer ptr) sama dengan ptr ditambah n * ukuran dalam byte tipe yang ditunjuk. Dengan demikian, untuk mengakses elemen ke-1 dari sebuah array, kita dapat menggunakan *(ptr + 1), tanpa perlu mempedulikan tipe dari elemen array tersebut. 2/7/2022 ALSRUDAT/W01S1 15 Dynamic Array • Array dibentuk saat runtime • Memanfaatkan pointer • Array of Integer dengan N elemen: int *ArrInt = malloc (N * sizeof *ArrInt); • Pengaksesan elemen sama seperti array statis • Harus didealokasi sendiri setelah selesai digunakan dengan perintah free. 2/7/2022 ALSRUDAT/W01S1 16 Dynamic Multidimensional Array • Alokasi array of pointer, inisialisasi tiap pointer dengan “baris” yang berupa array dinamis pula int **array1 = (int **) malloc(nrows * sizeof(int *)); for(i = 0; i < nrows; i++) array1[i] = (int *) malloc(ncolumns * sizeof(int)); • Jika ingin memori untuk keseluruhan array kontigu int **array2 = (int **) malloc(nrows * sizeof(int *)); array2[0] = (int *) malloc(nrows * ncolumns * sizeof(int)); for(i = 1; i < nrows; i++) array2[i] = array2[0] + i * ncolumns; 2/7/2022 ALSRUDAT/W01S1 17 Pointer to Pointer • A pointer can point to another pointer that points to a variable. • The illustration is given by the picture type **ptr_to_ptr = &ptr; 2/7/2022 ALSRUDAT/W01S1 18 Example Pointer to Pointer 2/7/2022 ALSRUDAT/W01S1 19 Pointer to multi dimensional array • If you have multi dimensional array declared as: type var_name[x][y]; x, y are size of elements • You can declare pointer that points to element of multi as follow: type (* ptr_name)[y]; • Example: int a[2][3]; int (*ptr_a)[3]; ptr = a; 2/7/2022 ALSRUDAT/W01S1 20 Pointer to multi dimensional array 2/7/2022 ALSRUDAT/W01S1 21 Arrays of pointers • Multi dimensional array declaration and operations can be performed using the so called “array of pointers”. char text[MAX][LEN]; means, you declare a number of MAX strings and each string has length equal to LEN. • You can declare multi dimensional array like the above example using arrays of pointers as: char *text[LEN]; 2/7/2022 ALSRUDAT/W01S1 22 Arrays of pointers 2/7/2022 ALSRUDAT/W01S1 23 So, why do we need to use pointer? • Background • C was developed when computers were much less powerful than today • being very efficient with speed and memory usage • to work with particular memory locations was obviously a useful option to have. 2/7/2022 ALSRUDAT/W01S1 24 So, why do we need to use pointer? (Cont’d) • A few tasks these days, such as programming microcontrollers, still need this • However most modern programmers do not need such fine control and the complications of using pointers • make programs less clear to understand • add to the ways in which they can be go wrong. • The reason is that pointers are used to some vital features which are missing from the original language: arrays, strings, & writeable function parameters. • They can also be used to optimize a program to run faster or use less memory that it would otherwise. 2/7/2022 ALSRUDAT/W01S1 25 • Thank you 2/7/2022 ALSRUDAT/W01S1 26