# Tugas Pendahuluan Modul 3 - Pointer ``` Nama : Hasan Abdullah Azzam NPM : 2406428314 ``` > Note: Soal Programming tidak perlu dicantumkan referensi, hanya soal Teori saja yang perlu referensi minimal 1. ## Teori ### 1. Apa itu tipe data pointer? Bagaimana cara kita mendeklarasikannya, dan bagaimana cara kita mengambil nilai dari sebuah variabel yang alamatnya ditunjuk oleh pointer? (15 poin) --- Pointer merupakkan jenis variabel yang menyimpan alamat memori dari variabel lainya. cara mendeklarasikanya dengan menambah `*` pada awal nama variabel pointer.`int *ptr;`. selain itu dalam pointer juga sering menggunakan lambang `&`, yang berfungsi untuk mengakses alamat memori dari suatu variabel. Karena pointer menyimpan alamat saja bukan nilainya, ketika ingin menggambil suatu nilai dari alamat pointer kita memerlukkan lambang `*` diawal variabel agar ouput nya merupakkan nilai dari variabel asal. ### Referensi: - “C Pointers,” GeeksforGeeks, Dec. 15, 2016. https://www.geeksforgeeks.org/c-pointers/. [Diakses: 24-Februari-2025] - “C Pointers,” www.w3schools.com. https://www.w3schools.com/c/c_pointers.php. [Diakses: 24-Februari-2025] ‌ --- ### 2. Dalam C, kita bisa menjalankan fungsi by reference dan by value. Jelaskan perbedaannya! (10 poin) `(Note: Base Case dan Recursive Case)` pada saat menjalankan suatu fungsi, biasanya kita membutuhkan berbagai parameter tertentu, sehingga proses berjalanya fungsi tidak terjadi error. ada 2 jenis utama dari paramterer fungsi. **pass by reference** dan **pass by value**, perbedaanya terletak pada bagaimana variabel diberikan kepada function. pada kasus **pass by value**, nilai dari parameter akan **disalin** dan dikirim sehingga dapat digunakan didalam function, tetapi karena yg dikirim hanya salinan saja, setiap perubahan didalamnya **tidak akan mempengaruhi** variabel asli di luar function dan hanya dapat digunakan saat function berjalan. berbeda dengan kasus **pass by reference**, parameter akan mengirimkan **alamat memori** dari variabel asal, sehingga selain dapat digunakkan didalam function, segala perubahan yang dilakukkan akan **dapat mempengaruhi** nilai asli di luar function. ### Referensi: - “C Functions,” GeeksforGeeks, Oct. 09, 2022. https://www.geeksforgeeks.org/c-functions/?ref=shm ‌ [Diakses: 24-Februari-2025] - --- ### 3. Salah satu metode paling umum membuat array dengan size fleksibel/dinamis adalah dengan malloc/calloc. Apakah command-command tersebut? Bagaimana cara pakainya? (15 poin) `(Note: Setelah selesai memakai malloc/calloc, memori harus dibebaskan (menggunakan free()). Tidak perlu dijelaskan di jawaban, namun penting untuk diingat` **malloc** dan **calloc** merupakkan function dari header **stdlib.h**, keduanya memiliki fungsi yang sama yaitu untuk **mengalokasikan blok memori** dengan ukuran yang spesifik, biasanya digunnkan pada **array dinamis** sehingga ukuran/ size dari array tersebut dapat **flexibel**. Perbedaan antara keduanya ada di bagaimana nilai awal dari variabelnya terdefinisi. pada function **malloc**, nilai awal **tidak** lah di **inisialisasi**, sehingga hanya mempunyai **nilai sampah dan acak** pada memori yang sudah dialokasikkan tersebut. sedangkan pada function **calloc**, nilai awal memori sudah **terdefinisi** sebagai `0`. Bentuk function: - Malloc `ptr = (type*) malloc(byte-size)` - Calloc `ptr = (type*) calloc(n, element-size)` Type: tipe variabel(int,char,float,dll) Byte-size: besar memori yang dialokasikkan n: jumlah elemen yang ingin digunakkan Element-size: besar memori dari suatu elemen dengan tipe data `type` ### Referensi: - GeeksforGeeks, “Dynamic memory allocation in C using malloc(), calloc(), free() and realloc(),” GeeksforGeeks, Dec. 13, 2018. https://www.geeksforgeeks.org/dynamic-memory-allocation-in-c-using-malloc-calloc-free-and-realloc/ .[Diakses: 24-Februari-2025] - “Difference Between malloc() and calloc() with Examples,” GeeksforGeeks, Feb. 27, 2010. https://www.geeksforgeeks.org/difference-between-malloc-and-calloc-with-examples/ .[Diakses: 24-Februari-2025] ‌ ‌ ### 4. Bagaimana cara untuk memberikan sebuah array / matrix sebagai argumen dalam fungsi (by reference / pointer)? (10 poin) dalam menjadikkan array(1D)/matriks(2D) sebagai parametr function, kita memiliki berbagai cara yang dapat digunakkan. kasus array / 1D: bisa langsung menjadikkan variabel array sebagai paramater `int arr[]` atau pun menggunakkan pointer terlebih dahulu `int *arr` keduanya sama dan dapat digunakkan, karena sejatinya pada saat memanggil `int arr[]`, hal ini akan mengacu pada alamat dari elemen pertama dari array tersebut, sehingga keduaanaya sama-sama menunjukkan alamat memori dan berlaku sebgai pointer,pass by reference. kasus matriks/2D: pada kasus 2D cara memasukkanparamter kedalam fubgsi hampir sama, pertama kita dapat memanggilnya secara langsung `int arr[][SIZE]` tetapi, dengan cara ini besar dari ukuran matriks harus sudah diketahui dan tidak bisa digunakkan untur array dinamis. cara kedua yaitu dengan menggunakkan pointer` int **arr`, dengan cara ini walupun syntak menjadi lebih kompleks, tetapi kta bisa meggunakanya untuk array dinamis. ### Referensi: - “How Arrays are Passed to Functions in C/C++?,” GeeksforGeeks, May 17, 2015. https://www.geeksforgeeks.org/how-arrays-are-passed-to-functions-in-cc/ .[Diakses: 24-Februari-2025] - “How to pass a 2D array as a parameter in C?,” GeeksforGeeks, May 01, 2014. https://www.geeksforgeeks.org/pass-2d-array-parameter-c/ .[Diakses: 24-Februari-2025] ‌ ‌ --- ## Programming ### 5. Buatlah sebuah program yang terdiri atas 2 part. Pertama, program akan meminta nama awal user, lalu memberi user 3 pilihan. #### a. Hitung Value ASCII Nama (20 poin) `Note: Bisa langsung memakai typecast` `Note2: Penghitungan wajib menggunakan function yang menerima array nama, dan pakai call by reference` #### b. Ganti Nama (30 poin) `Note: Untuk memudahkan soal ini, gunakan malloc untuk mengganti size array nama (jika panjang berbeda).` `Gunakan 1 array tetap untuk nama user` (dan c. Exit program) Contoh: ``` Masukkan nama Anda: Budiwir Opsi (Nama: Budiwir): a. Value ASCII Nama b. Ganti Nama c. Exit a Value nama Anda adalah 468 Opsi (Nama: Budiwir): a. Value ASCII Nama b. Ganti Nama c. Exit b Masukkan nama baru: Budi Opsi (Nama: Budi): a. Value ASCII Nama b. Ganti Nama c. Exit a Value nama Anda adalah 250 Opsi (Nama: Budi): a. Value ASCII Nama b. Ganti Nama c. Exit b Masukkan nama baru: goronggorong Opsi (Nama: goronggorong): a. Value ASCII Nama b. Ganti Nama c. Exit c Program Selesai! ``` Penjelasan: a. ASCII - Budiwir = B u d i w i r (Cek ASCII table) ![image](https://hackmd.io/_uploads/HyWhBEIq1e.png) - Budiwir = 42 + 75 + 64 + 69 + 77 + 69 + 72 - Budiwir = 468 - Budi = 42 + 75 + 64 + 69 - Budi = 250 **Note: C bisa mengubah char ke integer secara otomatis, jadi tidak perlu membuat fungsi khusus untuk menghitung nilai ASCII, cukup typecasting saja dari char ke int.** b. Ganti Nama Untuk bagian ini, array diharuskan **sama** untuk nama (tidak membuat array baru tiap kali nama diubah). **Note: Malloc/Calloc bisa digunakan untuk langsung mengubah size array, sehingga dapat memudahkan perubahan nama**. kode program ```c // Nama : Hasan Abdullah Azzam // NPM : 2406428314 // Note : TP 3 alprog // Deskirpsi : program menghitung nilai ASCII dari suatu string, mengganti nilai string menggunakkan realloc. #include <stdio.h> #include <stdlib.h> #include <string.h> void calculate(int *value, char *arr){ *value = 0; for(int i = 0; arr[i] != '\0'; i++){ *value += (int) arr[i]; } } void changename(char **arr){ char temp[50]; printf("masukkan nama : "); scanf(" %49s", temp); int panjang = strlen(temp) + 1; *arr = (char *) realloc(*arr, panjang * sizeof(char)); if(*arr == NULL){ printf("Error"); return; } strcpy(*arr,temp); } int main(){ int value; char *arr = (char *) malloc(1 * sizeof(char)); if(arr == NULL){ printf("error"); return 1; } changename(&arr); while(1){ char opsi; printf("\n==========\n"); printf("nama saat ini : %s\n", arr); printf("pilihan :\n"); printf("a. Nilai ASCII dari nama\n"); printf("b. Ganti nama\n"); printf("c. Exit\n"); printf("Masukkan opsi : "); scanf(" %c", &opsi); printf("\n==========\n"); switch(opsi){ case 'a': calculate(&value, arr); printf("total nilai ASCII : %d\n",value); break; case 'b': changename(&arr); break; case 'c': printf("program telah selesai"); break; default: printf("masukkan angka yang benar!!\n"); } if(opsi == 'c'){ break; } } free(arr); return 0; } ``` SS Output Program Kalian : ![image](https://hackmd.io/_uploads/B11CZb99ke.png)