recent
أخبار ساخنة

العمليات الرياضية على المؤشرات Pointers في لغة السي C الدرس|22|

الصفحة الرئيسية


العمليات الحسابية على المؤشرات

هل تعلم أن لغة سي تسمح لنا بإجراء العمليات الحسابية على المؤشرات Pointers, سنتعرف على كيفية عمل ذلك من خلال الكود, الآن ما عليكم سوى إنشاء مشروع جديد في المحرر لديكم و إتباعي على الكود الآتي, نحن نستخدم محرر CodeBlocks في دروسنا.

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
int array[4] = {20, 30, 40, 50};
printf("array[0] = %d\n", array[0]);
printf("array[1] = %d\n", array[1]);
printf("array[2] = %d\n", array[2]);
printf("array[3] = %d\n", array[3]);
return 0;
}

شرح المثال السابق 1

أنشأنا مصفوفة عددية نوع int و إسمها array و بها اربع عناصر و هي ( 20, 30, 40, 50 ) و قُمنا بطباعة هذه القيم على الشاشة بواسطة تحديدها عبر الأندكس الخاص بكل عنصر, ستكون نافذة الإخراج بالشكل


نُلاحظ أنه طَبَعَ لنا جميع القيم الموجودة في داخل هذه المصفوفة.


طباعة العناوين للقيم

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
int array[4] = {20, 30, 40, 50};
printf("array[0] = %p\n", &array[0]);
printf("array[1] = %p\n", &array[1]);
printf("array[2] = %p\n", &array[2]);
printf("array[3] = %p\n", &array[3]);
return 0;


شرح المثال السابق 2

أنشأنا مصفوفة عددية نوع int و إسمها array و بها اربع عناصر و هي ( 20, 30, 40, 50 ) و قُمنا بطباعة عناوين هذه القيم على الشاشة بواسطة تحديد العناوين عبر الأندكس الخاص بكل عنصر بوضع علامة & قبل إسم المصفوفة للدلالة أنه نريد عنوان و إستخدام الحرف p, ستكون نافذة الإخراج بالشكل


نُلاحظ في اول عنوان 0x7ffe9e957190 بنهايته أن نقطة البداية كانت 0 ثم النقطة الثانية كانت عند 4 لأن حجم int كما قُلنا في الدرس السابق هو 4 بايت و هذا يعني أن كل عنصر سوف يكون على بُعد 4 بايت من العنصر الذي قبله و عند النقطة الثالثة كان 8 و الرابعة c أي12 بالنظام الست عشري.


إستخدام المؤشرات للوصول للعناوين

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
int array[4] = {10, 20, 30, 40};
int *DataCs = &array[0];
printf("address array[0] = %p\n", DataCs);
printf("address array[1] = %p\n", DataCs + 1);
printf("address array[2] = %p\n", DataCs + 2);
printf("address array[3] = %p\n", DataCs + 3);
return 0;
}

شرح المثال السابق 3

أنشأنا مصفوفة عددية نوع int و إسمها array و بها اربع عناصر و هي ( 20, 30, 40, 50 ) و عرّفنا متغير إسمة DataCs و عرّفناه على أنه مؤشر ووضعنا نجمة قبلهُ و قُمنا بالتأشير على المُتغير الأول الذي في الأسفل, أي جعلنا هذا المؤشر يحمل قيمة العنصر الأول, و قُمنا بطباعة هذه القيم على الشاشة.


لقد قُمنا بالوصول إلى العناصر من دون إستعمال المصفوفة و إستعمال المؤشر على المصفوفة.

إستخدام المؤشرات للوصول للعناصر

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
int array[4] = {10, 20, 30, 40};
int *DataCs = &array[0];
printf("address array[0] = %d\n", *DataCs);
printf("address array[1] = %d\n", *DataCs + 1);
printf("address array[2] = %d\n", *DataCs + 2);
printf("address array[3] = %d\n", *DataCs + 3);
return 0;
}

شرح المثال السابق 4

عرّفنا متغير إسمة DataCs و عرّفناه على أنه مؤشر ووضعنا نجمة قبلهُ و قُمنا بالتأشير على المُتغير الأول الذي في الأسفل, أي جعلنا هذا المؤشر يحمل قيمة العنصر الأول, ثم في الأسفل عند القيمة الثانية وضعنا +1 و عند القيمة الثالثة +2 و القيمة الرابعة +3 هذا و عندما شغلنا الكود قد عمل بشكل طبيعي لكن يوجد خطأ, سنشرح الخطأ بعد صورة نافذة الإخراج الآتية


نُلاحظ أن القيمة الأولى ثابتة 10 أما الذي يليها تأتي متسلسلة له 11 و 12 و 13 و هذا يعني أنه لدينا العنوان الأول array[0] هو 10 ثم في الأسفل زِدنا على العنوان 1 في DataCs + 1 يعني أنه نحن قُمنا بالوصول للعنوان DataCs و زودنا عليه 1 فاصبحت القيمة 11 ثم بنفس الأمر لباقي القيم, و للوصول للقيم بدون زيادة 1 عليها نقوم بوضع اقواس كما يلي

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
int array[4] = {10, 20, 30, 40};
int *DataCs = &array[0];
printf("address array[0] = %d\n", *DataCs);
printf("address array[1] = %d\n", *(DataCs + 1));
printf("address array[2] = %d\n", *(DataCs + 2));
printf("address array[3] = %d\n", *(DataCs + 3));
return 0;
}

و عند تنفيذ هذا الكود سوف يطبع لنا عناصر المصفوفة و تم الوصول إليهم عن طريق إستخدام المؤشرات, و نافذة الإخراج للكود هي

إضغط هنا لقراءة الدرس السابق

google-playkhamsatmostaqltradent