Hari ini ketika saya membaca kode orang lain, saya melihat sesuatu seperti void *func(void* i);
, apa artinya inivoid*
artinya di sini untuk nama fungsi dan tipe variabel, masing-masing?
Selain itu, kapan kita perlu menggunakan pointer semacam ini dan bagaimana menggunakannya?
malloc
dancalloc
. Halaman manual selanjutnya mengatakan: "... kembalikan pointer ke memori yang dialokasikan, yang sesuai dengan jenis data bawaan apa pun."Jawaban:
Pointer ke
void
adalah tipe pointer "generik". Avoid *
dapat dikonversikan ke jenis penunjuk lain apa pun tanpa gips eksplisit. Anda tidak dapat melakukan dereferensivoid *
atau melakukan aritmatika pointer dengan itu; Anda harus mengonversinya menjadi pointer ke tipe data yang lengkap terlebih dahulu.void *
sering digunakan di tempat-tempat di mana Anda harus dapat bekerja dengan tipe pointer yang berbeda dalam kode yang sama. Salah satu contoh yang sering dikutip adalah fungsi perpustakaanqsort
:base
adalah alamat dari suatu array,nmemb
adalah jumlah elemen dalam array,size
adalah ukuran dari setiap elemen, dancompar
merupakan penunjuk ke fungsi yang membandingkan dua elemen dari array. Disebut demikian:Ekspresi Array
iArr
,dArr
danlArr
secara implisit dikonversi dari jenis array ke jenis pointer dalam panggilan fungsi, dan masing-masing secara implisit dikonversi dari "pointer keint
/double
/long
" untuk "pointer kevoid
".Fungsi perbandingan akan terlihat seperti:
Dengan menerima
void *
,qsort
dapat bekerja dengan array jenis apa pun.Kerugian menggunakan
void *
adalah bahwa Anda membuang jenis keselamatan keluar jendela dan masuk lalu lintas yang akan datang. Tidak ada yang melindungi Anda dari menggunakan rutin perbandingan yang salah:compareInt
mengharapkan argumennya menunjuk keint
s, tetapi sebenarnya bekerja dengandouble
s. Tidak ada cara untuk menangkap masalah ini pada waktu kompilasi; Anda hanya akan berakhir dengan array yang gagal.sumber
void*
dapat dilemparkan ke pointer fungsi. Tetapi untuk data pointer apa yang Anda katakan berlaku.Menggunakan void * berarti bahwa fungsi tersebut dapat mengambil pointer yang tidak perlu jenis tertentu. Misalnya, dalam fungsi soket, Anda punya
ini artinya Anda dapat menyebutnya dengan banyak cara, misalnya
sumber
C luar biasa dalam hal ini. Yang bisa dikatakan
void
adalah ketiadaanvoid*
adalah segalanya (bisa jadi segalanya).Hanya kecil ini
*
yang membuat perbedaan.Rene telah menunjukkannya. A
void *
adalah Pointer ke beberapa lokasi. Apa yang ada bagaimana "menafsirkan" diserahkan kepada pengguna.Ini satu-satunya cara untuk memiliki jenis buram dalam C. Contoh yang sangat menonjol dapat ditemukan misalnya di pustaka struktur data umum atau glib. Itu diperlakukan sangat rinci dalam "Antarmuka C dan implementasi".
Saya sarankan Anda membaca bab lengkap dan mencoba memahami konsep pointer untuk "mendapatkannya".
sumber
adalah 'penunjuk ke memori tanpa asumsi jenis apa yang disimpan'. Anda dapat menggunakan, misalnya, jika Anda ingin meneruskan argumen ke fungsi dan argumen ini bisa dari beberapa jenis dan dalam fungsi Anda akan menangani masing-masing jenis.
sumber
Anda dapat melihat artikel ini tentang pointer http://www.cplusplus.com/doc/tutorial/pointers/ dan membaca bab: void pointers .
Ini juga berfungsi untuk bahasa C.
sumber
Void pointer dikenal sebagai pointer generik. Saya ingin menjelaskan dengan skenario sampel pthread.
Fungsi utas akan memiliki prototipe sebagai
Perancang API pthread mempertimbangkan argumen dan mengembalikan nilai fungsi utas. Jika hal itu dibuat generik, kita dapat mengetikkan cast untuk membatalkan * saat mengirim sebagai argumen. demikian pula nilai kembali dapat diambil dari void * (Tapi saya tidak pernah menggunakan nilai balik dari fungsi utas).
sumber
pthread_exit(NULL);
daripadareturn 0;
di akhir main?a
void*
adalah pointer, tetapi tipe yang ditunjukkannya tidak ditentukan. Saat Anda melewatkan pointer kosong ke suatu fungsi, Anda harus tahu apa tipenya untuk mengembalikannya ke tipe yang benar nanti dalam fungsi untuk menggunakannya. Anda akan melihat contoh dalampthreads
fungsi yang menggunakan persis prototipe dalam contoh Anda yang digunakan sebagai fungsi utas. Anda kemudian dapat menggunakanvoid*
argumen sebagai pointer ke tipe data generik yang Anda pilih dan kemudian melemparkannya kembali ke tipe itu untuk digunakan dalam fungsi utas Anda. Anda harus berhati-hati saat menggunakan void pointer meskipun kecuali jika Anda case kembali ke pointer dari tipe yang sebenarnya, Anda dapat berakhir dengan segala macam masalah.sumber
Standar C11 (n1570) §6.2.2.3 al1 p55 mengatakan:
Anda bisa menggunakan pointer generik ini untuk menyimpan pointer ke semua tipe objek, tetapi Anda tidak bisa menggunakan operasi aritmatika biasa dengannya dan Anda tidak bisa menghormatinya.
sumber
Fungsi mengambil pointer ke tipe arbitrer dan mengembalikannya.
sumber
itu berarti pointer Anda dapat menggunakan tautan ini untuk mendapatkan info lebih lanjut tentang pointer http://www.cprogramming.com/tutorial/c/lesson6.html
sumber