# 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)

- 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 :
