Anda di halaman 1dari 15

LAPORAN PRAKTIKUM

PRAKTIKUM KONSEP PEMROGRAMAN

Entin Martiana Kusmaningtyas, S.Kom, M.Kom

NAMA: Septian Achmad Rojabbi


KELAS: 1/D4 TI A
NRP: 3122600025
PRAKTIKUM 26
Pointer 3
PERCOBAAN
Untuk setiap program di bawah ini,

– gambarkan ilustrasi alokasi memori dari setiap baris pernyataan yang


diproses
– perkirakan hasil eksekusinya

1. Array of Pointer to char


main() {
static char *days[] = {"Sun", "Mon", "Tues", "Wed","Thu",
"Fri", "Sat"};
int i;
for( i = 0; i < 6; ++i )
printf( "%s\n", days[i]);
}

Output
Alokasi memori
konstanta address Value
1000 S
U
N
\0
1001 M
O
N
\0
1002 T
U
E
S
\0
1003 W
E
D
\0
1004 T
H
U
\0
1005 F
R
I
\0
variable address Value
days 2000 1000
1001
1002
1003
1004
1005

2. Pointer yang menunjuk ke pointer yang lain.


main(){

int a, *b, **c;

a = 155;

b = &a;

c = &b;
printf("Nilai a = %d atau %d atau %d\n", a, *b, **c);

printf("b = %p = alamat a di memori\n", b);

printf("c = %p = alamat b di memori\n", c);

printf("alamat c di memori = %p\n", &c);

Output

Alokasi memori
Variable address value
A 0060FEFC 155
B 0060FEF8 0060FEFC
C 0060FEF4 0060FEF8

3. Pointer yang menunjuk ke pointer yang lain.


main(){

int var_x = 273;

int *ptr1;

int **ptr2;

ptr1 = &var_x;

ptr2 = &ptr1;

127

printf("Nilai var_x = *ptr1 = %d\n", *ptr1);

printf("Nilai var_x = **ptr2 = %d\n\n", **ptr2);

printf("ptr1 = &var_x = %p\n", ptr1);

printf("ptr2 = &ptr1 = %p\n", ptr2);


printf(" &ptr2 = %p\n", &ptr2);

Output

Alokasi memori
variable address Value
Var_x 0060FEFC 273
Ptr1 0060FEF8 0060FEFC
Ptr2 0060FEF4 0060FEF8

4. #include <stdio.h>
main(){

int a, *b, **c;

a = 1975;

b = &a;

c = &b;

printf("Nilai a = %d atau %d atau %d\n", a, *b, **c);

printf("b = %p = alamat a di memori\n", b);

printf("c = %p = alamat b di memori\n", c);

printf("alamat c di memori = %p\n", &c);

}
Alokasi memori
variabel address Value
A 0060FEFC 1975
B 0060FEF8 0060FEFC
c 0060FEF4 0060FEF8

5. Untuk potongan program di bawah ini, gambarkan ilustrasi alokasi memori dari setiap
baris pernyataan yang diproses
int *i;

int j=10, k, m[]={2, 5};

int **l;

i = m;

i++;

*i = j;

j = *i;

i = &j;

k = *(&j);

l = &i;

Alokasi memori
Variable Address Value
m[0] 0060FEEC 2
m[1] 0060FEF0 5 10
I 0060FEFC 0060FEEC 0060FEF0 0060FEF8
J 0060FEF8 10 10
K 0060FEF4 10
l 0060FEF8 0060FEFC
6. Tentukan setiap statemen di bawah ini benar atau salah. Jika salah sertakan alasannya.
Deklarasi :
int a[5] = {2,4,8,1,23};

int c = 5;

int *ptr1 = &c;

int *ptr2 = a;

Statement Benar(beri tanda X) Salah(beri tanda X) Alasan


a=c; X c bernilai 5sedangkan
a berbentuk array
dengan 5 indeks
*c = 6; X variabel *c tidak
terdeklarasi pada
program di atas
a[2]; X a[2] bernilai
4sedangkan c bernilai
5
*ptr2 = c; X *ptr2 bernilai 2
sedangkan c bernilai
5
&ptr1 = c; X ptr1 memiliki
alamatnya sendir
iyaitu 0022FEF0,
sedangkan c adalah 5
*(ptr2 + 1) = *(a + 3); X *(ptr2+1) bernilai
4sedangkan
*(a+3)bernilai 1
c = *(ptr2 + 1); X c bernilai 5
sedangkan *(ptr2+1)
bernilai 4
c = &ptr1; X ptr1 memiliki
alamatnya sendiri
yaitu 0022FEF0,
sedangkan c adalah 5
c = a[3] + 2; X c bernilai 5
sedangkan a[3] + 2
bernilai 10
*(ptr2 + 2) *ptr1; X *(ptr2+2) bernilai 8
sedangkan
*ptr1bernilai 5
PRAKTIKUM 27
POINTER 4
PERCOBAAN
1. Fungsi dengan argumen berupa pointer.
#include <stdio.h>

void naikkan_nilai(int *x, int *y);

main() {

int a = 3;

int b = 7;

printf("SEMULA : a = %d b = %d\n", a, b);

naikkan_nilai(&a, &b);

printf("KINI : a = %d b = %d\n", a, b);

void naikkan_nilai(int *x, int *y){

*x = *x + 2;

*y = *y + 2;

Output

Alokasi memori
variable address value
a 00FF761 3
5
b 00CF452 7
9
x 00OU3 00FF761
5
y 00YT4 00CF452
9
2. Fungsi dengan keluaran berupa pointer yang menunjuk string.
#include <stdio.h>

char *nama_bulan(int n);

main(){

int bl;

printf("Bulan 1..12 : ");

scanf("%d", &bl);

printf("Bulan ke-%d adalah %s\n", bl, nama_bulan(bl));

char *nama_bulan(int n){

static char *bulan[] = {

"Ngawur",

"Januari",

"Februari",

"Maret",

"April",

"Mei",

"Juni",

"Juli",

"Agustus",

"September",

"Oktober",

"November",

"Desember"

};

return ((n<1||n>12) ? bulan[0] : bulan[n]);

Output
Alokasi memori
variable address Value
b1 001 1 januari
002 2 februari
003 3 maret
004 4 april
005 5 mei
006 6 juni
007 7 juli
008 8 agustus
009 9 september
010 10 oktober
011 11 november
012 12 desember
Bulan[0] 013 Ngawur
Bulan[1] 014 Januari
Bulan[2] 015 Februari
Bulan[3] 016 Maret
Bulan[4] 017 April
Bulan[5] 018 Mei
Bulan[6] 019 Juni
Bulan[7] 020 Juli
Bulan[8] 021 Agustus
Bulan[9] 022 September
Bulan[10] 023 Oktober
Bulan[11] 024 November
Bulan[12] 025 desember

3. Berikan ilustrasi dan jelaskan apa yang dilakukan oleh program di bawah ini dan
tampilkan hasil eksekusinya.
#include <stdio.h>

char strA[80] = "A string to be used for demonstration";

char strB[80];

main(){

char *pA, *pB;

puts(strA);

pA = strA;

puts(pA);

pB = strB;
putchar('\n');

while(*pA != '\0')

*pB++ = *pA++;

*pB = '\0';

puts(strB);

Output

Alokasi memori
variable address value
strA 00GF981 A string to be used
demonstration
pA 00RE762 00GF81
pB 00AE903 00WE874
strB 00WE874 00GF981

Analisa
Ada string dengan indeks maksimum 80, string tersebut disebut strA yang
berisi karakter "String yang akan digunakan untuk demo". Selain itu, ada senar yang juga
memiliki indeks maksimum 80, bernama strB tetapi tidak mengandung nilai char. Setelah
Pergi ke fungsi utama, di mana pointer pA dideklarasikan dan pointer pB adalah
sebuah karakter. Setelah itu, strA dicetak, diketahui bahwa pA sama dengan strA,
kemudian cetak pA. pB memiliki nilai yang sama dengan strB, tetapi strB belum mengandung
karakter. bernilai
apa pun. Oleh karena itu, ada kondisi waktu. Dalam kondisi pA tidak sama dengan
null, lalu *pB++=*pA++. Dimana yang artinya sama dengan strB[0]=strA[0] dan seterusnya
sampai *pB nilainya nul. Kemudian cetak strB, dimana nilai strB sama dengan strA

Proses apakah yang sebenarnya dilakukan pada program tersebut ?


4. Berikan ilustrasi dan jelaskan apa yang dilakukan oleh program di bawah ini
#include <stdio.h>

char *my_strcpy(char *, char *);

main(){

char strA[80]="A string to be used for demonstration";

char strB[80];

my_strcpy(strB, strA);

puts(strB);

char *my_strcpy(char *destination, char *source) {

char *p = destination;

while (*source != '\0')

*p++ = *source++;

*p = '\0';

return destination;

Output

Alokasi memori
variable address Value
strA 00JK641 A string to be used demonstration
destination 00CV643 00TV782
P 00KG894 00CV643
souce 00UI565 00JK641
strB 00TV782 00CV643
ANALISA
Dalam program tersebut terdapat sebuah fungsi yang bertipe char dan fungsi tersebut disebut
my_strcpy. Fungsinya adalah pointer ke strB dan strA. Di
diketahui bahwa fungsi utama memiliki string yang indeksnya paling banyak 80, dan string
tersebut disebut
strA di mana nilai char dari string adalah "String yang akan digunakan untuk demo"
dan ada strB yang juga diketahui max indexnya 80 tapi tidak diketahui
berharga. Kemudian fungsi my_strcpy dipanggil, di dalam fungsi proses dijalankan
menyatakan bahwa pointer p menunjuk ke nilai tujuan (di mana tujuan
menunjuk ke strB). Jadi ada syaratnya, jika sumbernya tidak sama dengan nol
(dimana sumber menunjuk ke nilai strA) maka indeks P a 0 sama dengan indeks sumber a
0, dan indeks terus meningkat hingga nilai p bernilai nol. Jadi yang dikembalikan adalah
Nilai dari destination sehingga di fungsi utama dicetak strB yaitu destination. Yang mana
hasilnya sama dengan strA

5. Bandingkan fungsi my_strcpy() di atas dengan fungsi my_strcpy() di bawah ini.


Berikan penjelasan terhadap perbedaan proses dari kedua fungsi tersebut
char *my_strcpy(char dest[], char source[]){

int i = 0;

while (source[i] != '\0')

dest[i] = source[i];

i++;

dest[i] = '\0';

return dest;

}
Alokasi memori
variable address value
strA 00FF871 A string to be used for
demonstration
strB 00FF342 00FF#$2
Dest[i] 00FF873 00FF565
Source[i] 00FF565 00FF873
i 00FF346 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

ANALISA
Dalam program ada fungsi my_strcpy dari tipe char dan mereka adalah penunjuk. Dengan string
target menunjuk ke string strB dan string sumber menunjuk ke strA. Pada fungsi utama, nilai
char dari strA diketahui berupa string yang akan digunakan untuk demonstrasi. Jadi nilai strB
tidak diketahui dan memanggil fungsi my_strcpy. Pada program ini fungsi my_strcpy berbeda
dengan program nomor 5, perbedaannya adalah fungsi ini menggunakan loop indeks tanpa
pointer ... jika angka 5 menggunakan kenaikan pointers Dalam fungsi ini prosesnya adalah
bahwa nilai awal i diketahui 0, jadi ada kondisi jika indeks sumber untuk I tidak sama dengan
nol, itu akan mengeksekusi indeks tujuan untuk I sama dengan dengan indeks sumber a i. lalu
saya tingkatkan. Proses akan terus berlanjut sampai dest indeks ke-i tidak sama dengan nol. Nilai
dest kemudian dikembalikan dan dimasukkan ke dalam Fungsi utamanya adalah strB. Oleh
karena itu yang tercetak adalah strB dan nilainya sama persis sebagai strA

6. Buatlah sebuah program dengan mendefinisikan sebuah fungsi rotasi() yang


menerima tiga parameter berupa variabel a, b, dan c. Fungsi ini melakukan rotasi
sehingga nilai a berpindah ke b, b ke c dan nilai c ke a sekembalinya ke fungsi main().
#include <stdio.h>
#include <stdlib.h>
int rotasi(int *, int *, int *);
int main()
{
printf("Rotasi Program\n");
int a,b,c, hasil;
printf("Masukkan nilai 3 bilangan pisahkan dg spasi : ");
scanf("%d %d %d", &a, &b, &c);
printf("\nSebelum rotasi a=%d, b=%d, c=%d\n", a, b, c);
rotasi(&a,&b,&c);
printf("\nSetelah rotasi a=%d, b=%d, c=%d\n\n", a, b, c);
return 0;
}
int rotasi(int *x,int *y,int *z)
{
int temp;
temp=*x;
*x=*y;
*y=*z;
*z=temp;
}

Output

ANALISA
Program diatas menggunakan pointer sebagai parameter dalam fungsi. Terlihat yang dikirim
pada parameter aktual di fungsi rotasi() adalah alamat dari masing-masing variabel. Selanjutnya
alamat dari parameter aktual tadi diterima pada parameter formal dengan variabel pointer.
Dengan begitu, di dalam fungsi dapat dilakukan perpindahan nilai variabel dengan bantuan satu
variabel penampung.

Anda mungkin juga menyukai