نوع داده void
void یک نوع داده خاص در زبان C است که به معنای "هیچ مقداری" یا "تهی" میباشد. این نوع داده برخلاف سایر انواع (مانند int یا char)، هیچ مقداری را ذخیره نمیکند و نمیتوان متغیری از نوع void تعریف کرد. کاربرد اصلی void در سه حوزه مشخص است: توابع بدون مقدار بازگشتی، توابع بدون پارامتر، و اشارهگرهای عمومی.
void بهعنوان نوع بازگشتی تابع
زمانی که یک تابع هیچ مقداری را بازنمیگرداند، از void بهعنوان نوع بازگشتی استفاده میشود. چنین توابعی معمولاً برای اثرات جانبی (side effects) مانند چاپ خروجی یا تغییر یک متغیر سراسری به کار میروند.
#include <stdio.h> // تابعی که مقداری بازنمیگرداند void displayMessage(void) { printf("سلام! این یک پیام است.\n"); // return; // اختیاری - در توابع void میتوان بدون مقدار return کرد } // تابعی با شرط خروج زودهنگام void printIfPositive(int x, int y) { if (x <= 0 || y <= 0) { return; // خروج زودهنگام از تابع } printf("x = %d, y = %d\n", x, y); } int main() { displayMessage(); // فقط پیام را چاپ میکند printIfPositive(5, 3); // چاپ: x = 5, y = 3 printIfPositive(-1, 5); // چیزی چاپ نمیشود return 0; }
در یک تابع void، میتوان از دستور return; (بدون مقدار) برای خروج زودهنگام استفاده کرد، اما وجود آن اجباری نیست و تابع میتواند با رسیدن به انتهای بدنه بهطور خودکار بازگردد.
نکته مهم: اگر تابعی از نوع
voidتعریف شده باشد، نمیتوان از مقدار بازگشتی آن در عبارات استفاده کرد. کد زیر خطای کامپایل خواهد داشت:void foo(void) { /* ... */ } int x = foo(); // خطا - foo مقدار بازنمیگرداند
void بهعنوان لیست پارامترهای خالی
برای مشخص کردن اینکه یک تابع هیچ پارامتری نمیگیرد، از کلمه کلیدی void در لیست پارامترها استفاده میشود.
#include <stdio.h> // تابعی که هیچ پارامتری نمیگیرد int getVersion(void) { return 1; } // تابعی که هیچ پارامتری نمیگیرد و هیچ مقداری بازنمیگرداند void printHeader(void) { printf("=== Header ===\n"); } int main() { int v = getVersion(); // درست - بدون آرگومان // getVersion(10); // خطا - این تابع پارامتر نمیگیرد printHeader(); // درست return 0; }
تفاوت foo(void) با foo()
در زبان C، این دو شکل معادل یکدیگر نیستند:
| تعریف | معنی |
|---|---|
void foo(void) | تابع هیچ پارامتری نمیگیرد |
void foo() | تابع تعداد نامشخصی پارامتر میگیرد (اما در C++ معادل void است) |
void f1(void) { /* ... */ } void f2() { /* ... */ } int main() { f1(); // درست // f1(10); // خطا - f1 هیچ پارامتری نمیگیرد f2(); // درست f2(10); // در C این کار مجاز است (اما در C++ خطاست) [citation:7] return 0; }
اشارهگرهای void (void*)
اشارهگر از نوع void*، یک اشارهگر عمومی است که میتواند به هر نوع دادهای اشاره کند، بدون آنکه نوع خاصی برای آن مشخص باشد. این ویژگی برای توابع عمومی مانند malloc و qsort بسیار مفید است.
ویژگیهای اشارهگر void:
#include <stdio.h> #include <stdlib.h> int main() { int a = 42; double b = 3.14; char c = 'A'; // اشارهگر void میتواند به هر نوع دادهای اشاره کند void *ptr; ptr = &a; // اشاره به int printf("int: %d\n", *(int*)ptr); // نیاز به cast قبل از dereference ptr = &b; // اشاره به double printf("double: %.2f\n", *(double*)ptr); ptr = &c; // اشاره به char printf("char: %c\n", *(char*)ptr); // کاربرد در malloc - بازگشت void* به هر نوعی قابل تبدیل است int *numbers = (int*)malloc(5 * sizeof(int)); if (numbers == NULL) { printf("خطا در تخصیص حافظه\n"); return 1; } numbers[0] = 10; printf("عدد: %d\n", numbers[0]); free(numbers); // free نیز void* میگیرد return 0; }
قوانین مهم اشارهگرهای void:
| قانون | توضیح |
|---|---|
| عدم امکان dereference مستقیم | نمیتوان *ptr نوشت؛必须先 cast کرد |
| تبدیل خودکار در انتساب | void* بهخودکار به هر نوع اشارهگر دیگری تبدیل میشود |
| عدم پشتیبانی از محاسبات اشارهگری | نمیتوان ptr++ یا ptr + 1 انجام داد (مگر در GCC با -Wpedantic) |
| کاربرد در توابع عمومی | malloc، calloc، free، qsort و bsearch از void* استفاده میکنند |
مثال استفاده در تابع عمومی مقایسه:
#include <stdio.h> #include <stdlib.h> #include <string.h> // تابع مقایسه عمومی int compareInts(const void *a, const void *b) { return (*(int*)a - *(int*)b); // cast به int* قبل از dereference } int compareStrings(const void *a, const void *b) { return strcmp(*(const char**)a, *(const char**)b); } int main() { int numbers[] = {5, 2, 8, 1, 9}; qsort(numbers, 5, sizeof(int), compareInts); printf("اعداد مرتب: "); for (int i = 0; i < 5; i++) { printf("%d ", numbers[i]); } printf("\n"); return 0; }
جمعبندی
| کاربرد | مثال | توضیح |
|---|---|---|
| نوع بازگشتی تابع بدون مقدار | void printMsg(void) | تابع هیچ مقداری بازنمیگرداند |
| پارامتر خالی | int foo(void) | تابع هیچ پارامتری نمیگیرد |
| اشارهگر عمومی | void *ptr = &x; | میتواند به هر نوع دادهای اشاره کند |
| عدم امکان تعریف متغیر | void v; | خطا - نمیتوان متغیر از نوع void تعریف کرد |
| مقایسه با None/Python | void در C | معادل None در پایتون نیست، زیرا void هیچ مقداری را نشان نمیدهد و نمیتوان آن را به متغیر انتساب داد |
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: منبع مستندات