Uploaded by Marianne Wencesla Solang

ALSRUDAT Advanced Pointer

advertisement
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
Download