recent
أخبار ساخنة

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

الصفحة الرئيسية
العمليات الرياضية على المؤشرات

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

العمليات الحسابية Pointer Arithmetic, هل تعلم أن لغة سي تسمح لنا بإجراء العمليات الحسابية على المؤشرات 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;
}

أنشأنا مصفوفة عددية نوع int و إسمها array و بها اربع عناصر و هي ( 20, 30, 40, 50 ).

وقُمنا بطباعة هذه القيم على الشاشة بواسطة تحديدها عبر الأندكس الخاص بكل عنصر.

ستكون نافذة الإخراج بالشكل

array[0] = 20
array[1] = 30
array[2] = 40
array[3] = 50

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


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

#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;
} 

أنشأنا مصفوفة عددية نوع int و إسمها array و بها اربع عناصر و هي ( 20, 30, 40, 50 ).

وقُمنا بطباعة عناوين هذه القيم على الشاشة بواسطة تحديد العناوين عبر الأندكس الخاص بكل عنصر. بوضع علامة & قبل إسم المصفوفة للدلالة أنه نريد عنوان و إستخدام الحرف p.

ستكون نافذة الإخراج بالشكل

array[0] = 0x7ffe9e957190
array[1] = 0x7ffe9e957194
array[2] = 0x7ffe9e957198
array[3] = 0x7ffe9e95719c

نُلاحظ في اول عنوان 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;
}

أنشأنا مصفوفة عددية نوع int و إسمها array و بها اربع عناصر و هي ( 20, 30, 40, 50 ).

و عرّفنا متغير إسمة DataCs و عرّفناه على أنه مؤشر ووضعنا نجمة قبلهُ و قُمنا بالتأشير على المُتغير الأول الذي في الأسفل.

أي جعلنا هذا المؤشر يحمل قيمة العنصر الأول, و قُمنا بطباعة هذه القيم على الشاشة.

array[0] = 0x7ffc9cf3bd40
array[1] = 0x7ffc9cf3bd44
array[2] = 0x7ffc9cf3bd48
array[3] = 0x7ffc9cf3bd4c
لقد قُمنا بالوصول إلى العناصر من دون إستعمال المصفوفة و إستعمال المؤشر على المصفوفة.

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

#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;
}

عرّفنا متغير إسمة DataCs و عرّفناه على أنه مؤشر ووضعنا نجمة قبلهُ و قُمنا بالتأشير على المُتغير الأول الذي في الأسفل.

أي جعلنا هذا المؤشر يحمل قيمة العنصر الأول, ثم في الأسفل عند القيمة الثانية وضعنا +1 و عند القيمة الثالثة +2 و القيمة الرابعة +3.

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

address array[0] = 10
address array[1] = 11
address array[2] = 12
address array[3] = 13

نُلاحظ أن القيمة الأولى ثابتة 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;
}

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

address array[0] = 10
address array[1] = 20
address array[2] = 30
address array[3] = 40
google-playkhamsatmostaqltradent