انواع دادهی اشارهگر در ++C
اشارهگرها (Pointers) در ++C انواع مختلفی دارند که هرکدام کاربرد خاصی دارند. در ادامه مهمترین انواع اشارهگرها رو بررسی میکنیم:
۱. اشارهگرهای معمولی (Normal Pointers)
این اشارهگرها به یک متغیر از یک نوع خاص اشاره میکنند.
int x = 10;
int* ptr = &x; // اشارهگر به متغیر x
int* ptr = &x; // اشارهگر به متغیر x
۲. اشارهگر تهی (Null Pointer)
این اشارهگر مقدار nullptr یا NULL میگیرد و به هیچ آدرسی اشاره نمیکند.
int* ptr = nullptr; // مقداردهی اولیه برای جلوگیری از اشاره به آدرس نامعتبر
۳. اشارهگر به اشارهگر (Pointer to Pointer)
این نوع اشارهگر به آدرسی اشاره میکند که خودش یک اشارهگر است.
int x = 5;
int* ptr = &x;
int** pptr = &ptr; // اشارهگر به اشارهگر
int* ptr = &x;
int** pptr = &ptr; // اشارهگر به اشارهگر
۴. اشارهگر ثابت (Constant Pointer)
دو نوع اشارهگر ثابت داریم:
- اشارهگری که مقدارش ثابت است:
const int* ptr = &x; // مقدار x را نمیتوان تغییر داد
- اشارهگری که خودش ثابت است:
int* const ptr = &x; // نمیتوان ptr را به متغیر دیگری اشاره داد
- ترکیب هر دو:
const int* const ptr = &x; // هم مقدار و هم اشارهگر ثابت است
۵. اشارهگر Void (Void Pointer)
این اشارهگر میتواند به هر نوع دادهای اشاره کند ولی قبل از استفاده باید تبدیل نوع (Type Casting) شود.
void* ptr;
int x = 10;
ptr = &x; // اشاره به یک متغیر صحیح
int x = 10;
ptr = &x; // اشاره به یک متغیر صحیح
۶. اشارهگر به آرایه (Pointer to Array)
int arr[] = {1, 2, 3};
int* ptr = arr; // اشارهگر به اولین عنصر آرایه
int* ptr = arr; // اشارهگر به اولین عنصر آرایه
۷. اشارهگر به تابع (Pointer to Function)
برای نگه داشتن آدرس یک تابع و استفاده از آن:
#include
using namespace std;
void sayHello() {
cout << "Hello, World!" << endl;
}
int main() {
void (*funcPtr)() = sayHello; // اشارهگر به تابع
funcPtr(); // اجرای تابع از طریق اشارهگر
return 0;
}
using namespace std;
void sayHello() {
cout << "Hello, World!" << endl;
}
int main() {
void (*funcPtr)() = sayHello; // اشارهگر به تابع
funcPtr(); // اجرای تابع از طریق اشارهگر
return 0;
}
۸. اشارهگر هوشمند (Smart Pointer) - از ++C ورژن 11 به بعد
در ++C میتوان از اشارهگرهای هوشمند مثل unique_ptr، shared_ptr و weak_ptr استفاده کرد که مدیریت حافظه را بهینه میکنند.
#include
#include
using namespace std;
int main() {
unique_ptr ptr = make_unique(10);
cout << *ptr << endl;
return 0;
}
#include
using namespace std;
int main() {
unique_ptr ptr = make_unique(10);
cout << *ptr << endl;
return 0;
}
