ساختارها و اشاره گرها در برنامه نویسی C

در این آموزش یاد خواهید گرفت که چگونه با استفاده از اشاره گرها به اعضای ساختارها در برنامه نویسی C دسترسی پیدا کنید. همچنین با تخصیص حافظه پویای ساختار آشنا خواهید شد.
ساختارها (Structures)
-
مفهوم یکپارچگی: ساختارها ابزاری برای بستهبندی و تجمیع متغیرهای مختلف (با انواع دادههای متفاوت) در قالب یک نام و موجودیت واحد هستند.
-
تخصیص حافظه: برخلاف یونیونها که تمام اعضا از یک فضای مشترک استفاده میکردند، در ساختارها به هر یک از اعضا فضای حافظه کاملاً مستقل و اختصاصی تعلق میگیرد. در نتیجه، اندازه نهایی یک ساختار در حافظه، برابر با مجموع حجم تکتک اعضای آن (بهعلاوه مقداری فضای احتمالی برای ترازسازی حافظه) است.
-
دسترسی همزمان: از آنجا که هر عضو بلوک حافظه مختص به خود را دارد، تمام اطلاعات درون یک ساختار به صورت همزمان معتبر و در دسترس هستند و تغییر یکی باعث از بین رفتن دیگری نمیشود.
-
فلسفه استفاده: هدف اصلی، سازماندهی منطقی دادههای پراکنده اما مرتبط به هم است تا بتوان مجموعهای از اطلاعات ناهمگون را به عنوان یک بسته منسجم در سیستم تعریف و مدیریت کرد.
اشارهگرها (Pointers)
-
مفهوم آدرسیابی: اشارهگرها متغیرهای ویژهای هستند که به جای نگهداری اطلاعات واقعی، «آدرس فیزیکی» یک خانه از حافظه سیستم را در خود ذخیره میکنند. آنها شبیه به تابلوی راهنمایی هستند که به جای ارائه خودِ محتوا، نشان میدهند محتوا دقیقاً در کجای حافظه قرار دارد.
-
کنترل مستقیم و پویایی: این ابزار به برنامهنویس بالاترین سطح دسترسی را برای کنترل مستقیم حافظه سختافزاری میدهد و امکان مدیریت پویای حافظه (دریافت و آزادسازی فضا در حین اجرای برنامه) را فراهم میکند.
-
فلسفه استفاده: هدف اصلی استفاده از اشارهگرها، جلوگیری از کپی شدنهای بیموردِ دادههای حجیم در حافظه، کاهش مصرف منابع سیستم و افزایش چشمگیر سرعت پردازش است.
ترکیب ساختارها و اشارهگرها قدرت واقعی زبان C در ترکیب این دو مفهوم نهفته است. زمانی که یک ساختار حاوی حجم عظیمی از اطلاعات است، جابهجا کردن و کپی کردن مکرر آن بین بخشهای مختلف برنامه به شدت کُند و هزینهبر خواهد بود.
با استفاده از اشارهگرها، برنامهنویس به جای کپی کردن کل آن بسته اطلاعاتی سنگین، تنها «آدرس» آن ساختار را به بخشهای مختلف برنامه ارسال میکند. علاوه بر این، ترکیب ساختارها و اشارهگرها پایه و اساس ایجاد معماریهای داده پیشرفته و زنجیرهای را تشکیل میدهد؛ جایی که هر ساختار میتواند آدرس محل قرارگیری ساختار بعدی را درون خود نگه دارد و شبکهای پیوسته از دادهها را در حافظه ایجاد کند.
قبل از شروع درباره استفاده از اشاره گرها با ساختارها، آموزش های زیر را مرور کنید:
- اشاره گرها در برنامه نویسی C
- ساختارها در برنامه نویسی C
اشاره گر به ساختار در C
در اینجا شیوه تعریف اشاره گر به ساختار آورده شده است.
struct name {
member1;
member2;
.
.
};
int main()
{
struct name *ptr, Harry;
}
در اینجا ptr یک اشاره گر به struct name است.
مثال: دسترسی به اعضای ساختار با استفاده از اشاره گر
برای دسترسی به اعضای یک ساختار با استفاده از اشاره گرها از عملگر <- استفاده می شود.
#include
struct person
{
int age;
float weight;
};
int main()
{
struct person *personPtr, person1;
personPtr = &person1;
printf(“Enter age: “);
scanf(“%d”, &personPtr->age);
printf(“Enter weight: “);
scanf(“%f”, &personPtr->weight);
printf(“Displaying:n”);
printf(“Age: %dn”, personPtr->age);
printf(“weight: %f”, personPtr->weight);
return 0;
}
در این مثال، آدرس person1 با استفاده از دستور personPtr = &person1; در اشاره گر personPtr ذخیره می شود.
حالا می توانید با استفاده از اشاره گر personPtr به اعضای person1 دسترسی پیدا کنید.
- personPtr->age معادل (personPtr).age* است
- personPtr->weight معادل (personPtr).weight* است.
تخصیص حافظه پویا ساختارها
قبل از شروع این بخش توصیه می کنیم آموزش تخصیص حافظه پویا در برنامه نویسی C را بررسی کنید.
گاهی اوقات ممکنه تعداد متغیرهای تعریف شده از ساختار کافی نباشند، بنابراین باید در زمان اجرای برنامه حافظه تخصیص دهید. در مثال زیر شیوه انجام کار آورده شده است.
مثال: تخصیص حافظه پویا ساختارها
#include
#include
struct person {
int age;
float weight;
char name[30];
};
int main()
{
struct person *ptr;
int i, n;
printf(“Enter the number of persons: “);
scanf(“%d”, &n);
// person از ساختار n تخصیص حافظه به تعداد
ptr = (struct person*) malloc(n * sizeof(struct person));
for(i = 0; i < n; ++i)
{
printf(“Enter first name and age respectively: “);
// person برای دسترسی به اعضای اولین ساختار,
// استفاده می شود ptr->name , ptr->age
// person برای دسترسی به اعضای دومین ساختار,
// استفاده می شود (ptr+1)->name , (ptr+1)->age
scanf(“%s %d”, (ptr+i)->name, &(ptr+i)->age);
}
printf(“Displaying Information:n”);
for(i = 0; i < n; ++i)
printf(“Name: %stAge: %dn”, (ptr+i)->name, (ptr+i)->age);
return 0;
}
خروجی
Enter the number of persons: 2
Enter first name and age respectively: Harry 24
Enter first name and age respectively: Gary 32
Displaying Information:
Name: Harry Age: 24
Name: Gary Age: 32
در مثال بالا، تعداد n متغیر از ساختار به صورت پویا ساخته شده است، n توسط کاربر وارد می شود.
ptr = (struct person*) malloc(n * sizeof(struct person));
سپس از اشاره گر ptr برای دسترسی به عناصر person استفاده شده است.

personPtr->age معادل (personPtr).age* است
پاسخاین جمله صحیح است یا هنگام تایپ کردن جابه‌جایی صورت گرفته؟