C Pointers & Structures
Materi ke‐6
Dodi Sudiana & Alfan Presekal
Mengapa mempelajari Pointer? 2
• Setiap variabel yang kita deklarasikan akan mereservasi
suatu lokasi dalam memori komputer
• Lokasi tsb memiliki address
• Untuk mengakses address memori tsb, gunakan tanda &
(ampersand)
• Contoh: scanf(“%d”, &var1);
Artinya kita ingin meminta suatu input integer dan
ingin diletakkan di address memori dimana var1 telah
melakukan reservasi sebelumnya
3
4
Code Result
#include <stdio.h> Address of var1 variable: 6a33e9ac
Address of var2 variable: 6a33e9a0
int main ()
{
int var1;
char var2[10];
return 0;
}
Apa itu Pointer? 5
• Sebuah Pointer sebenarnya juga merupakan variable
• Bedanya dgn variable biasa:
– Pointer menyimpan address dari variable lain
• Isi pointer adalah address dari variable lain
– Variable biasa menyimpan suatu value spesifik direct reference
• Pointer digunakan untuk menunjuk lokasi memori di
mana sebuah value ingin disimpan dengan cara
menyebutkan address dari variable tempat seharusnya
value tsb disimpan indirect reference
5
Sedang 6
Ayah kos
Citra Citra
Jalan Baru
no 10
7
Pointer Declaration 8
• Tanda* digunakan untuk mendeklarasikan pointer
• <variable_type> *<pointer_var_name>;
• Tipe (type) pointer sama dengan tipe variabel yang
ditunjuknya
• int *ip; /* pointer to an integer */
• double *dp; /* pointer to a double */
• float *fp; /* pointer to a float */
• char *ch /* pointer to a character */
• Jika ingin mendeklarasikan lebih dari 1 pointer, tanda *
ditulis sebelum tiap nama pointer variable
• int *myPtr1, *myPtr2;
8
Pointer Initialization 9
10
11
11
#include <stdio.h> 12
int main ()
{
int y = 20; /* actual variable declaration */
int *yPtr; /* pointer variable declaration */
13
1 /* Fig. 7.4: fig07_04.c
2 Using the & and * operators */ Outline
3 #include <stdio.h>
4
14
5 int main( void )
6 { fig07_04.c
7 int a; /* a is an integer */
8 int *aPtr; /* aPtr is a pointer to an integer */ (1 of 2 )
9
10 a = 7;
11 aPtr = &a; /* aPtr set to address of a */
12
13 printf( "The address of a is %p"
If aPtr points to a, then &a and
14 "\nThe value of aPtr is %p", &a, aPtr ); aPtr have the same value.
15
16 printf( "\n\nThe value of a is %d" a and *aPtr have the same value
17 "\nThe value of *aPtr is %d", a, *aPtr );
18
19 printf( "\n\nShowing that * and & are complements of "
20 "each other\n&*aPtr = %p" &*aPtr and *&aPtr have the same value
21 "\n*&aPtr = %p\n", &*aPtr, *&aPtr );
22
23 return 0; /* indicates successful termination */
24
The address of a is 0012FF7C
25 } /* end main */ The value of aPtr is 0012FF7C
The value of a is 7
The value of *aPtr is 7
• Ada kalanya kita tidak/belum ingin meng‐
assign sebuah pointer ke suatu address
variable
• Disebut Null Pointer
– Meng‐assign NULL value ke pointer
– Dilakukan saat variable declaration.
• Akan sangat berguna ketika menggunakan
linked list
15
16
#include <stdio.h>
int main ()
{ int *ptr = NULL;
printf("The value of ptr is : %x\n", ptr );
return 0;
}
16
Calling Functions by Reference 17
20
Fig. 7.8 | Analysis of a typical call-by-value.
Pointer to Array 21
• Sebenarnya sebuah nama array merupakan
constant pointer pada elemen pertama dari array
tersebut.
– Contoh:
double balance[50];
balance secara otomatis adalah pointer ke &balance[0]
• Kita dapat juga membuat pointer baru yang
menunjuk ke array
double *pPtr;
double balance[10];
pPtr = balance;
Assign pPtr alamat element pertama dari array balance tanpa
menggunakan tanda &
21
22
• Mis. array tipe integer array b[5] dan
pointer integer pointer variable bPtr
– bPtr = b; bPtr = &b[ 0 ];
• *( bPtr + 3 ) sama dengan elemen array ke‐
4 atau b[3]
22
Array values using pointer
*(p + 0) : 1000.0
*(p + 1) : 2.0 23
#include <stdio.h> *(p + 2) : 3.4
*(p + 3) : 17.0
int main () *(p + 4) : 50.0
{
Array values using balance as
/* an array with 5 elements */ address
double balance[5] = {1000.0, 2.0, 3.4, 17.0, 50.0};
*(balance + 0) : 1000.0
double *p;
*(balance + 1) : 2.0
int i;
*(balance + 2) : 3.4
p = balance;
/* output each array element's value */
*(balance + 3) : 17.0
printf( "Array values using pointer\n"); *(balance + 4) : 50.0
for ( i = 0; i < 5; i++ )
{
printf("*(p + %d) : %.1f\n", i, *(p + i) );
}
printf( "Array values using balance as address\n");
for ( i = 0; i < 5; i++ )
{
printf("*(balance + %d) : %.1f\n", i, *(balance + i) );
}
return 0; 23
}
Mengirim array ke function 24
(call‐by‐reference)
• Karena nama array sudah merupakan
pointer, maka ketika kita mem‐passing
array ke function secara by reference, tidak
perlu lagi menggunakan tanda &
• Mengirimkan secara by reference pada
contoh sebelumnya:
double (&num); //num adalah variable
Contoh berikutnya:
convertToUppercase( string ); /*string adalah array.
Tanpa tanda & */
24
1 /* Fig. 7.10: fig07_10.c
2
3
Converting lowercase letters to uppercase letters
using a non-constant pointer to non-constant data */
Outline
4 25
5 #include <stdio.h>
6 #include <ctype.h>
7
fig07_10.c
8 void convertToUppercase( char *sPtr ); /* prototype */
9 (1 of 2 )
10 int main( void )
11 {
12 char string[] = "characters and $32.98"; /* initialize char array */
13
14 printf( "The string before conversion is: %s", string ); String is array, so send without &
15 convertToUppercase( string ); /* send without & */
16 printf( "\nThe string after conversion is: %s\n", string );
17
18 return 0; /* indicates successful termination */
19
20 } /* end main */
21
25
22 /* convert string to uppercase letters */
23 void convertToUppercase( char *sPtr )
24 {
Outline
25 while ( *sPtr != '\0' ) { /* current character is not '\0' */ 26
26
27 if ( islower( *sPtr ) ) { /* if character is lowercase, */
fig07_10.c
28 *sPtr = toupper( *sPtr ); /* convert to uppercase */
29 } /* end if */
30
(2 of 2 )
31 ++sPtr; /* move sPtr to the next character */ Both sPtr and *sPtr are modified by the
32 } /* end while */ convertToUppercase function
33
34 } /* end function convertToUppercase */
26
27
Latihan
Silakan dikerjakan latihan 1 dan 2 di
EMAS
Submit by 16:00 WIB hari ini