"Decay" mengacu pada konversi tersirat dari ekspresi dari tipe array ke tipe pointer. Dalam sebagian besar konteks, ketika kompiler melihat ekspresi array, ia mengubah tipe ekspresi dari "N-element array of T" menjadi "pointer to T" dan menetapkan nilai ekspresi ke alamat elemen pertama dari array. . Pengecualian untuk aturan ini adalah ketika sebuah array adalah operan dari baik sizeof
atau &
operator, atau array adalah string literal digunakan sebagai initializer dalam deklarasi.
Asumsikan kode berikut:
char a[80];
strcpy(a, "This is a test");
Ekspresi a
adalah tipe "80-elemen array char" dan ekspresi "Ini adalah tes" adalah tipe "16-elemen array char" (dalam C; dalam string C ++ string literal adalah array dari const char). Namun, dalam panggilan ke strcpy()
, tidak ada ekspresi yang merupakan operan dari sizeof
atau &
, jadi tipe mereka secara implisit dikonversi menjadi "pointer ke char", dan nilainya diatur ke alamat elemen pertama di masing-masing. Apa yang strcpy()
diterima bukan array, tetapi pointer, seperti yang terlihat dalam prototipe:
char *strcpy(char *dest, const char *src);
Ini bukan hal yang sama dengan pointer array. Sebagai contoh:
char a[80];
char *ptr_to_first_element = a;
char (*ptr_to_array)[80] = &a;
Kedua ptr_to_first_element
dan ptr_to_array
memiliki yang sama nilai ; alamat dasar a. Namun, mereka berbeda jenis dan diperlakukan berbeda, seperti yang ditunjukkan di bawah ini:
a[i] == ptr_to_first_element[i] == (*ptr_to_array)[i] != *ptr_to_array[i] != ptr_to_array[i]
Ingat bahwa ekspresi a[i]
ditafsirkan sebagai *(a+i)
(yang hanya berfungsi jika tipe array dikonversi ke tipe pointer), jadi keduanya a[i]
dan ptr_to_first_element[i]
berfungsi sama. Ekspresi (*ptr_to_array)[i]
diartikan sebagai *(*a+i)
. Ekspresi *ptr_to_array[i]
dan ptr_to_array[i]
dapat menyebabkan peringatan kompiler atau kesalahan tergantung pada konteksnya; mereka pasti akan melakukan hal yang salah jika Anda mengharapkan mereka untuk mengevaluasi a[i]
.
sizeof a == sizeof *ptr_to_array == 80
Sekali lagi, ketika sebuah array adalah operan sizeof
, itu tidak dikonversi ke tipe pointer.
sizeof *ptr_to_first_element == sizeof (char) == 1
sizeof ptr_to_first_element == sizeof (char *) == whatever the pointer size
is on your platform
ptr_to_first_element
adalah pointer sederhana ke char.
int a[10]; int b(void);
, maka+a
adalah penunjuk int dan+b
penunjuk fungsi. Berguna jika Anda ingin meneruskannya ke templat yang menerima referensi.