آموزش اشاره گر به struct در C++ (به زبان کاملا ساده)
در این آموزش، نحوه استفاده از اشاره گرها برای دسترسی به داده ها در struct را به همراه مثال می آموزید.
متغیر اشاره گر فقط برای انواعی مانند (int، float، double و غیره) ایجاد نمی شود، بلکه برای متغیر های ساختار هم تعریف می شود.
در اینجا نحوه ایجاد اشاره گر به ساختار را مشاهده می کنید:
- #include
- using namespace std;
- struct temp {
- int i;
- float f;
- };
- int main() {
- temp *ptr;
- return 0;
- }
در مثال بالا اشاره گر ptr از نوع ساختار temp ایجاد شده است.
مثال : اشاره گر به ساختار در C++
- #include
- using namespace std;
- struct Distance
- {
- int feet;
- float inch;
- };
- int main()
- {
- Distance *ptr, d;
- ptr = &d;
- cout << “Enter feet: “;
- cin >> (*ptr).feet;
- cout << “Enter inch: “;
- cin >> (*ptr).inch;
- cout << “Displaying information.” << endl;
- cout << “Distance = ” << (*ptr).feet << ” feet ” << (*ptr).inch << ” inches”;
- return 0;
- }
خروجی
Enter feet: 4
Enter inch: 3.5
Displaying information.
Distance = 4 feet 3.5 inches
در این برنامه، متغیر اشاره گر ptr و متغیر عادی d از نوع ساختار Type تعریف شده اند.
آدرس متغیر d در اشاره گر ptr ذخیره می شود، یعنی ptr به متغیر d اشاره دارد. سپس، اعضای struct متغیر d با استفاده از اشاره گر قابل دسترسی هستند.
نکته: از آنجا که اشاره گر ptr به متغیر d در این برنامه اشاره دارد،
(*ptr).inch
و
d.inch
دقیقا یکی هستند.
(*ptr).feet
و
d.feet
هم یکی هستند.
روش دیگر دسترسی به اعضای struct با اشاره گر، استفاده از -> است.
ptr->feet is same as (*ptr).feet
ptr->inch is same as (*ptr).inch
تکات مهم
در استفاده از اشارهگرها به ساختارها (struct) در C++، توجه به چند نکته مهم میتواند به بهبود عملکرد و جلوگیری از بروز خطاهای رایج کمک کند.در اینجا به برخی از این نکات مهم اشاره میکنیم:
1.مدیریت حافظه دینامیکی
هنگام استفاده از حافظه دینامیکی با `new` و `delete`، مطمئن شوید که به درستی حافظه را تخصیص داده و آزاد میکنید تا از نشت حافظه (memory leak) جلوگیری شود.
Person* personPtr = new Person{"Bob", 25};
// استفاده از personPtr
delete personPtr; // آزادسازی حافظه
2.استفاده از smart pointers
برای مدیریت خودکار حافظه و جلوگیری از مشکلات نشت حافظه، از smart pointers ها مثل `std::unique_ptr` و `std::shared_ptr` استفاده کنید.
#include <memory>
std::unique_ptr<Person> personPtr = std::make_unique<Person>("Bob", 25);
// استفاده از personPtr، حافظه به طور خودکار آزاد میشود
3.استفاده از اشارهگرهای توابع در ساختارها
هنگام استفاده از اشارهگرهای توابع در ساختارها، مطمئن شوید که امضای تابع (function signature) درست باشد.
struct Calculator {
int (*add)(int, int);
};
int add(int a, int b) {
return a + b;
}
Calculator calc = { add };
4.مدیریت ساختارهای تو در تو
در ساختارهای تو در تو، توجه داشته باشید که اشارهگرهای داخل ساختار به درستی مقداردهی شده و به حافظه صحیح اشاره میکنند.
struct Address {
std::string city;
std::string street;
};
struct Person {
std::string name;
int age;
Address* address;
};
Address addr = {"New York", "5th Avenue"};
Person person = {"Charlie", 28, &addr};
5.استفاده از const برای ایمنی بیشتر
اگر قرار نیست اشارهگر یا دادههای اشارهشده تغییر کنند، از `const` استفاده کنید تا ایمنی کد افزایش یابد.
void printPerson(const Person* personPtr) {
std::cout << "Name: " << personPtr->name << ", Age: " << personPtr->age << std::endl;
}
6.استفاده از آرایهها و اشارهگرها
در مدیریت آرایههای ساختارها با اشارهگرها، دقت کنید که به محدوده آرایه (array bounds) تجاوز نکنید.
Person people[3] = { {"David", 30}, {"Eva", 22}, {"Frank", 27} };
Person* personPtrs[3];
for (int i = 0; i < 3; ++i) {
personPtrs[i] = &people[i];
}
7.مدیریت صحیح مقداردهی اولیه
مطمئن شوید که ساختارها و اشارهگرها به درستی مقداردهی اولیه شدهاند تا از بروز خطاهای دسترسی به حافظه جلوگیری شود.
Person person;
Person* personPtr = &person;
personPtr->name = "Alice"; // مقداردهی اعضای ساختار
personPtr->age = 30;
8.استفاده از مرجعها به جای اشارهگرها
در برخی موارد، استفاده از مرجعها (references) به جای اشارهگرها میتواند خوانایی کد را افزایش دهد و از برخی مشکلات اشارهگرها جلوگیری کند.
void printPerson(const Person& person) {
std::cout << "Name: " << person.name << ", Age: " << person.age << std::endl;
}
Person person = {"Alice", 30};
printPerson(person);
9.رعایت قوانین دسترسی به حافظه
از دسترسی به حافظهای که آزاد شده است یا مقداردهی نشده است، پرهیز کنید.این دسترسیها میتوانند منجر به رفتارهای غیرقابل پیشبینی شوند.
10.آگاهی از زمان زندگی متغیرها
هنگام استفاده از اشارهگرها، توجه کنید که متغیر مورد اشاره از محدوده (scope) خارج نشود و حافظه آن همچنان معتبر باشد.
با رعایت این نکات، میتوانید به صورت کارآمدتر و ایمنتر با اشارهگرها به ساختارها در C++ کار کنید و از بروز خطاهای رایج جلوگیری کنید.
مطالب مفید و کاربردی هستند
پاسخولی یه ایراد داره اینکه بدون اطلاعات قبلی نمی تونی این مقاله رو درک کنی
توصیه می کنم قبل از اینکه وارد مباحث سخت تر بشین اطلاعات پایه را درج کنید