Secara fungsional dan sintaksis, apakah ada perbedaan antara fungsi yang prototipe-nya int foo(void)
dan int foo(void *)
?
Saya tahu perbedaan antara, misalnya, int bar(int)
dan int bar(int *)
- salah satunya mencari int, dan yang lainnya mencari pointer int. Apakah void
berperilaku dengan cara yang sama?
c++
c
function-prototypes
Nick Reed
sumber
sumber
foo(void)
danfoo()
.Jawaban:
Dari jawaban ini di Rekayasa Perangkat Lunak,
void
diperlakukan khusus tergantung pada bagaimana itu digunakan. InC
danC++
,void
digunakan untuk menunjukkan tidak adanya tipe data, sedangkanvoid *
digunakan untuk menunjukkan pointer yang menunjuk ke beberapa data / ruang dalam memori yang tidak memiliki tipe.void *
tidak dapat disereferensi sendiri, dan harus dilemparkan ke tipe lain terlebih dahulu. Pemeran ini tidak perlu eksplisit dalamC
, tetapi harus eksplisit dalamC++
. (Inilah sebabnya kami tidak memberikan nilai pengembalian malloc, yaituvoid *
.)Ketika digunakan dengan fungsi sebagai parameter,
void
berarti tidak adanya parameter apa pun, dan hanya parameter yang diizinkan. Mencoba menggunakan kekosongan seperti tipe variabel atau menyertakan argumen lain menghasilkan kesalahan kompilator:Tidak mungkin untuk mendeklarasikan variabel dengan tipe
void
:void
sebagai nilai balik untuk fungsi menunjukkan tidak ada data yang akan dikembalikan. Karena tidak mungkin untuk mendeklarasikan variabel tipevoid
, tidak mungkin untuk menangkap nilai balik suatuvoid
fungsi, bahkan dengan pointer kosong.Jenis
void *
yang berbeda adalah kasus yang berbeda. Pointer batal menunjukkan pointer ke lokasi di memori, tetapi tidak menunjukkan tipe data pada pointer itu. (Ini adalah yang digunakan untuk mencapai polimorfisme dalam C , seperti dengan fungsi qsort () .) Pointer ini bisa rumit untuk digunakan, karena sangat mudah untuk secara tidak sengaja melemparkannya ke tipe yang salah. Kode di bawah ini tidak akan memasukkan kesalahan kompilatorC
, tetapi menghasilkan perilaku yang tidak terdefinisi:Namun, kode berikut ini sepenuhnya legal; casting ke dan dari void pointer tidak pernah mengubah nilai yang dimilikinya.
Sebagai parameter fungsi,
void *
menunjukkan bahwa tipe data pada pointer yang Anda lewati tidak diketahui, dan terserah Anda, pemrogram, untuk menangani dengan baik apa pun yang ada di lokasi memori itu. Sebagai nilai balik,void *
menunjukkan bahwa jenis data yang dikembalikan tidak diketahui atau tidak bertipe, dan harus ditangani oleh program.tl; dr
void
dalam prototipe fungsi berarti "tidak ada data" dan menunjukkan tidak ada nilai balik atau tidak ada parameter,void *
dalam prototipe fungsi berarti "data pada penunjuk fungsi ini diberikan tidak memiliki tipe yang dikenal" dan menunjukkan parameter atau nilai balik penunjuk yang harus dilemparkan ke jenis yang berbeda sebelum data di penunjuk dapat digunakan.sumber
void * ... must be cast to another type first, but may be done so without an explicit cast.
Tidak benar dalam C ++. Dalam C ++ bentuk konversivoid*
harus eksplisit. PS yang memanggil pemain eksplisit tidak ada karena pemain menurut definisi adalah konversi eksplisit.foo(void)
- berfungsi tanpa parameterfoo(void *)
- berfungsi dengan satuvoid *
parameterApa
void *
? Ini hanya pointer ke data tanpa tipe yang ditentukan. Itu dapat dicor ke jenis pointer lainnyasumber
(type) vs. (type *)
alam semesta pasangan karena kekosongan sebenarnya bukan tipe.Ada perbedaan:
int foo(void)
mendeklarasikan fungsi yang tidak menerima argumen.int foo(void *)
mendeklarasikan fungsi yang menerima argumen tipe tunggalvoid*
.Dalam C ++,
int foo(void)
sama denganint foo()
.sumber