تعد المؤشرات حيوية للعديد من برامج لغة C، ولكن قد يكون من الصعب فهمها. قم بمراجعة بناء الجملة وكيفية عملها باستخدام أمثلة عملية.

تعد المؤشرات جانبًا أساسيًا في برمجة C والتي ستحتاج إلى فهم جيد لها لاستخدام اللغة بشكل فعال. فهي تساعد في إدارة الذاكرة بكفاءة، وتمرير البيانات حسب المرجع، والتعامل مع المصفوفات والسلاسل، والمزيد. ومع ذلك، فإنها تتطلب الاستخدام الدقيق لتجنب الأخطاء.

استكشف تفاصيل مؤشرات C، بدءًا من فهم الذاكرة والعناوين وحتى إتقان حساب المؤشر.

الذاكرة والعناوين

الذاكرة - غالبًا ما تستخدم كاختصار لـ ذاكرة الوصول العشوائي (ذاكرة الوصول العشوائي)- هي مساحة التخزين الموجودة في جهاز الكمبيوتر والتي تحتوي على البيانات والتعليمات التي يحتاجها البرنامج لتشغيله. إنه بمثابة مساحة عمل لبرنامجك. أصغر وحدة في الذاكرة هي عادة بايت، وهو ما يعادل ثمانية بتات.

يحتوي كل موقع ذاكرة على عنوان فريد ويمكنه تخزين كمية مختلفة من البيانات اعتمادًا على جهاز الكمبيوتر. عندما تعلن عن متغير في لغة C، فإنك تقوم ضمنيًا بتعيين موقع ذاكرة له لتخزين بياناته. فكر في الأمر وكأنه منزل له عنوان فريد يمكنك استخدامه لتحديد موقعه.

instagram viewer

تخيل أن ذاكرة جهاز الكمبيوتر الخاص بك عبارة عن سلسلة من خلايا التخزين، تحتوي كل منها على بايت من البيانات. لنفترض أن هناك متغيرين، س و ذ، في برنامج C:

int x = 5;
int y = 10;

في الذاكرة، قد يبدو الأمر كما يلي:

عنوان

بيانات

1000

5

1004

10

هنا، تقوم مواقع الذاكرة المنفصلة بتخزين هذه المتغيرات. البيانات التي س يمثل موجودًا في عنوان الذاكرة 1000، بينما ذتحتل بيانات عنوان الذاكرة 1004.

يعد فهم الذاكرة والعناوين أمرًا بالغ الأهمية عند التعامل مع المؤشرات لأنها متغيرات تخزن عناوين الذاكرة. إنها تتيح لك الوصول إلى البيانات المخزنة في موقع ذاكرة محدد ومعالجتها.

الإعلان عن المؤشرات وتهيئتها في C

قبل أن تتمكن من تعديل البيانات باستخدام المؤشرات في لغة C، عليك الإعلان عنها وتهيئتها.

تصريح

للإعلان عن مؤشر، عليك تحديد نوع البيانات الذي يشير إليه، متبوعًا بعلامة النجمة (*)، ثم اسم المؤشر. على سبيل المثال:

int *ptr;

هنا، كثافة العمليات * بتر يعلن مؤشر اسمه بتر يمكنه تخزين عنوان الذاكرة لعدد صحيح.

التهيئة

بعد الإعلان، يجب عليك تهيئته بعنوان الذاكرة الذي سيشير إليه. يمكنك تهيئته على النحو التالي:

int x = 5;
int *ptr = &x;

وفي هذا الإعلان، & يقوم المشغل بجلب عنوان المتغير x. يقول الكود بشكل أساسي "ptr هو متغير، فهو يخزن موقع الذاكرة لقيمة عددية، وهذا الموقع هو المكان الذي يشير إليه x حاليًا."

الآن، بتر يحمل عنوان المتغير الصحيح س. على سبيل المثال:

عامل

عنوان

قيمة

س

1000

5

بتر

1000

لا تقوم المؤشرات في لغة C بتخزين عنوان المتغير فحسب، بل تحتوي أيضًا على عنوان فريد خاص بها داخل ذاكرة الكمبيوتر.

مؤشرات إلغاء الإشارة

إن إلغاء الإشارة إلى مؤشر C يعني الوصول إلى القيمة المخزنة في عنوان الذاكرة الذي يشير إليه المؤشر.

لنفترض أن لديك مؤشرًا، كثافة العمليات * بتر، يشير إلى متغير عدد صحيح، وهذا المتغير له قيمة 10. للوصول إلى القيمة من خلال المؤشر، يمكنك استخدام العلامة النجمية (*) المشغل أو العامل:

int x = 10;

int *ptr = &x; // ptr points to the address of x

int value = *ptr; // Dereferencing ptr to get the value

يستخدم هذا المثال بتر متغير لاسترداد القيمة على عنوان الذاكرة الذي يشير إليه. لذا، قيمة يحمل الآن القيمة 10، وهي محتوى س.

المؤشر الحسابي

يعد حساب المؤشر ميزة قوية في لغة C، وهو مفيد بشكل خاص للعمل مع المصفوفات والسلاسل (وهي عبارة عن مصفوفات من الأحرف). يتيح لك إجراء العمليات الحسابية على المؤشرات للتنقل في الذاكرة.

إليك مثال يوضح كيف يمكنك استخدامه.

ابدأ بالإعلان عن مجموعة من الأعداد الصحيحة:

int numbers[] = {10, 20, 30};

قم بتعريف مؤشر إلى int وقم بتعيين موقع الذاكرة الخاص بمصفوفة الأرقام إليه:

int *ptr = numbers;

لا تحتاج إلى استخدام عامل التشغيل "&" هنا لأن الأرقام هي بالفعل، ضمنيًا، نوع مؤشر.

يشير المتغير ptr الآن إلى العنصر الأول في المصفوفة:

printf("%d\n", *ptr); // 10

يمكنك نقل المؤشر إلى العنصر الثالث من المصفوفة عن طريق زيادته بمقدار 2:

ptr += 2;
printf("%d\n", *ptr); // 30

يمكنك تحريك المؤشر للخلف عن طريق الطرح منه:

ptr--;
printf("%d\n", *ptr); ;// 20

يعد حساب المؤشر مفيدًا بشكل خاص للتنقل بين المصفوفات والعمل مع تخصيص الذاكرة الديناميكية.

المؤشرات والوظائف في C

اذا أنت فهم كيفية عمل الوظائف في برمجة C، فأنت في طريقك لاستخدام المؤشرات الوظيفية. فيما يلي بعض الطرق التي يمكنك استخدامها.

مؤشرات الوظيفة

يمكنك الإعلان عن مؤشرات الوظائف واستخدامها لاستخدام الوظائف ديناميكيًا، تمامًا مثل أي قيمة أخرى. وهذا مفيد بشكل خاص لعمليات الاسترجاعات وتنفيذ الوظائف الديناميكية.

int (*operation)(int, int); // Declare a function pointer
operation = add; // Pointer to an add function
int result = operation(5, 3); // Call the function through the pointer

يعلن هذا الرمز عن مؤشر دالة اسمه عملية يمكن أن يشير إلى دالة تأخذ عددين صحيحين وترجع واحدًا. يقوم بتعيين (مؤشر لـ). يضيف وظيفة ل عملية. ثم يستخدم متغير العملية للاتصال بشكل غير مباشر إضافة (5، 3).

المرور حسب المرجع

تسمح لك المؤشرات بتمرير الوسائط بالرجوع إلى الوظائف، مما يتيح لك تعديل البيانات الأصلية داخل الوظيفة. يعد هذا أمرًا بالغ الأهمية للوظائف التي تحتاج إلى تغيير قيمة متغير خارج نطاقها.

voidmodifyValue(int *x){
*x = 42; // Modifies the value of x in the calling code
}

ال تعديل القيمة تغير الدالة قيمة أي وسيطة يوفرها رمز الاستدعاء لها، وتضبطها على 42.

تخصيص الذاكرة الديناميكية

يمكن للوظائف إرجاع المؤشرات إلى الذاكرة المخصصة ديناميكيًا. يعد هذا أمرًا شائعًا عندما تحتاج إلى إنشاء وإرجاع هياكل بيانات غير محدودة مثل المصفوفات أو القوائم المرتبطة. سوف تحتاج إلى لديك فهم جيد للذاكرة المكدسة والكومة لتستخدمها.

int *createArray(intsize){
int *arr = (int *)malloc(size * sizeof(int));
return arr;
}

يحدد هذا الرمز وظيفة، createArray، وهذا يأخذ عددا صحيحا، مقاس، كمدخل. داخل الوظيفة، تقوم بتخصيص الذاكرة ديناميكيًا لمصفوفة أعداد صحيحة بالحجم المحدد باستخدام malloc. بعد تهيئة المصفوفة، تقوم بإرجاع مؤشر إلى هذه المصفوفة التي تم إنشاؤها حديثًا.

الاستخدامات الشائعة

المؤشرات ضرورية في لغة C لعدة أسباب، وهي: تميز لغة C عن لغات البرمجة الأخرى مثل بايثون. فيما يلي بعض الاستخدامات الشائعة:

  • تخصيص الذاكرة الديناميكية
  • التلاعب بالمصفوفة
  • المرور حسب المرجع
  • هياكل البيانات
  • إدارة الموارد

إن فهم هذه الاستخدامات الشائعة للمؤشرات يمكن أن يعزز مهاراتك في البرمجة بلغة C. تدرب على بعض هذه الأشياء لتحسين فهمك للمؤشرات.

التدرب على استخدام المؤشرات في برمجة C

يعد إتقان المؤشرات في برمجة C مهارة قيمة تمكنك من إدارة الذاكرة بكفاءة ومعالجة البيانات وتنفيذ العمليات المتقدمة. سيؤدي التدريب والكفاءة في استخدام المؤشرات إلى تحسين قدرتك على إنشاء برامج C قوية وموفرة للموارد بشكل كبير.