recent
أخبار ساخنة

تعديل القيم في البرنامج بواسطة المؤشرات Pointers في لغة السي C الدرس|20|


تعديل القيم بواسطة المؤشرت

حتى الآن تعلّمنا كيفية تعريف المؤشرات Pointers و إسترجاع القيمة الموجودة في العناوين التي تُشير إليها, لكن هل يُمكننا تعديل هذه القيم و ليس مجرد إسترجاعها؟

في آخر مثال في الدرس السابق قُمنا بإنشاء متغير x=26 و قُمنا بطباعة المُتغير x و كانت قيمته في البدايه هي 26 ثم قُمنا بطباعة العنوان الخاص في x و كان العنوان هو 0x7ffffb1fc864 من النوع hexadecimal ثم قُمنا بتخزين هذا العنوان, و لتخزين عنوان مُتغير يجب إنشاء مُتغير من نوع pointer و لا يمكن إنشاء مُتغير عادي كما في x ثم قُمنا بطباعة قيمة هذا المتغير و هذا المتغير يحمل قيمة عنوان لذلك لا نَضَع d لأننا لا نطبَع رقماً عُشرياً, بل نطبَع عنواناً و العنوان هذا من النوع الست عشري و ليس من الأرقام العادية من 0 إلى 9, ثم قُمنا بالوصول إلى القيمة الموجودة داخل العنوان من خلال النجمة و قلنا أنَّ هناك فرق عند النجمة عند التعريف و النجمة عند الإستخدام, النجمة عند التعريف تعني أننا نُعرِّف مُتغير من نوع pointer و أما النجمة عند الإستخدام فتعني أننا نُريد الوصول إلى القيمة التي تَسكُن في هذا العنوان لهذا الـ pointer.

سنعتمد على المثال الذي كان بنهاية الدرس السابق, سنقوم اولاً بتعديل قيمة x لنرى النتيجة

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
    int x = 26;
    printf("X value = %d\n", x);
    printf("X address = %p\n", &x);
    int *xPointer = &x;
    printf("X Pointer = %p\n", xPointer);
    x = 23;
    printf("The value inside the title %p = %d\n", xPointer, *xPointer);
    return 0;
}

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

نُلاحظ أن x في البداية كانت تُساوي 26 و عندما غيرّنا قيمة x إلى 23, تغيرت قيمة x في دالة الطباعة الأخيرة عند *xPointer عندما إستدعيناها للطباعة, عندما قُمنا بطباعة القيمة التي بداخل العنوان *xPointer تم طباعة قيمة x الجديدة و النتيجة هي


يُمكن ايضاً تغيير قيمة x من خلال الـ Pointer فنحن لدينا وصول كامل من خلال العنوان على المتغير الذي يسكُن هذا العنوان, مثلاً لدينا عنوان منزل يُمكننا تغيير ما بداخل هذا المنزل, لطالما لدينا العنوان من خلال الوصول إلى ما بداخل هذا المنزل و بكل بساطة نقوم بكتابة *xPointer كما تمت طباعتها بالأسفل و نقوم بتغيير قيمتها كما يلي

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
    int x = 26;
    printf("X value = %d\n", x);
    printf("X address = %p\n", &x);
    int *xPointer = &x;
    printf("X Pointer = %p\n", xPointer);
    *xPointer = 1995;
    printf("The value inside the title %p = %d\n", xPointer, *xPointer);
    return 0;
}

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

بإعتمادنا على المثال السابق لقد قُمنا بتغيير قيمة x من خلال الـ Pointer و غيّرنا القيمة إلى 1995 ثم قُمنا بالطباعة و طبع لنا مكان سَكَن هذا المتغير من الذاكرة و يساوي القيمة الجديدة و هي 1995 و عند تشغيل الكود سنجد النتيجة الآتية


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

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
    int x = 7, *cs = &x;
    printf("%d\n", *cs * *cs);
    return 0;
}

 

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

هنا قُمنا بإنشاء متغير من نوع integer و أسميناه x و قيمته هي 7 و انشأنا Pointer معه في نفس السطر و هذا المؤشر سيقوم بالتأشير على int و نُلاحظ أن إسم هذا الـ Pointer هو *cs و النجمة وضعناها ملاصقة لإسم هذا المؤشر يعني أن هذا المتغير هو مؤشر من نوع int و قيمته تساوي عنوان x و كلمة عنوان إختصرناها برمز & للدلالة على أن هذا هو العنوان يقع في x و قُمنا بالطباعة و كتبنا *cs الأولى تعني الوصول إلى القيمة التي تقع داخل العنوان *cs ووضعنا نجمه ايضاً أن يكون العملية عملية ضرب ثم كتبنا *cs مثل كأننا نقول x ضرب x و عند تشغيل الكود نتيجته ستكون 49 كما يلي


مثال

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
    int x = 7, *cs = &x;
    printf("%d\n", *&x);
    return 0;
}

 

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

قُمنا بإنشاء متغير من نوع integer و أسميناه x و قيمته هي 7 و انشأنا Pointer معه في نفس السطر و هذا المؤشر سيقوم بالتأشير على int و نُلاحظ أن إسم هذا الـ Pointer هو *cs و النجمة وضعناها ملاصقة لإسم هذا المؤشر يعني أن هذا المتغير هو مؤشر من نوع int و قيمته تساوي عنوان x و كلمة عنوان إختصرناها برمز & للدلالة على ان هذا هو العنوان يقع في x ثم قمنا بطباعة *&x تعني قم بفتح ما بداخل العنوان و اُنظر ما هي القيمة التي بداخل هذا العنوان x و عندما نرى النتيجة ستكون كما يلي


عندما نرى * بعدها & فإن النجمة تلغي مفعول الـ &, فإن قمنا هنا بالتبديل بين & و النجمة &*x سوف يعطينا خطأ لا يمكن وضع نجمة قبل الـ x ﻷن x هو متغير من نوع int و عند وضع النجمة قبل المتغير مباشرتاً تعني أن المتغير الذي يأتي بعد النجمة هو من نوع Pointer أي منزل, مكان, عنوان, عندما نضع نجمه يعني انظر إلى داخل هذا العنوان.

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

google-playkhamsatmostaqltradent