البرمجة

فهم الفارق: تعريف المتغير والمصفوفة في لغة البرمجة C

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

أولًا وقبل كل شيء، دعونا نتحدث عن الفرق بين تعريف المؤشر على char وبين تعريف مصفوفة السلاسل.

عندما تقوم بتعريف char *c ="Hello";، فإنك تعرف مؤشرًا إلى سلسلة من الأحرف، ولكن هذا لا يعني أنك لا يمكنك تغيير المحتوى الذي يشير إليه المؤشر. بمعنى آخر، يمكنك تعديل الحروف في السلسلة نفسها، على الرغم من أنه يجب أن تتحمل المسؤولية عن التحكم في الحجم والتخصيص الذي قد يتطلبه ذلك.

أما بالنسبة لمصفوفة السلاسل التي قدمتها char *p [] = {"Hello","World"};، فإنها تعرف مصفوفة من المؤشرات إلى سلاسل الأحرف. في هذه الحالة، يمكنك تغيير المؤشر نفسه ليشير إلى سلسلة جديدة. لكن عند القول *p= "Mode";، أنت في الواقع تقوم بتعديل المؤشر الذي يشير إلى السلسلة “Hello” بحيث يشير الآن إلى السلسلة “Mode”.

لاحظ أن هذا لا يعني تغيير الحروف في السلسلة “Hello” نفسها، بل تغيير المؤشر ليشير إلى سلسلة جديدة. ولن يحدث أي خطأ في هذه العملية، لأن p هو مجرد مصفوفة من المؤشرات، وليس مصفوفة من السلاسل المتغيرة.

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

المزيد من المعلومات

بالطبع، دعونا نعزز فهمنا لهذا السياق من خلال إلقاء نظرة أكثر تفصيلاً على كيفية عمل المصفوفة p والاختلافات بين تعريف المتغير c وتعريف المصفوفة p.

عند تعريف المصفوفة p:

c
char *p[] = {"Hello", "World"};

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

rust
p[0] ---> | 'H' | 'e' | 'l' | 'l' | 'o' | '\0' | p[1] ---> | 'W' | 'o' | 'r' | 'l' | 'd' | '\0' |

كل مؤشر p[i] يشير إلى بداية سلسلة نصية. ومع ذلك، يجب أن نفهم أن تغيير المؤشر p نفسه، كما حدث في الكود الذي قدمته:

c
*p = "Mode";

لن يؤدي إلى تغيير السلسلة “Hello” بشكل مباشر. بدلاً من ذلك، المؤشر p سيشير الآن إلى السلسلة “Mode” وليس “Hello”. الذي يعني أن المصفوفة في الذاكرة ستبدو كالتالي:

rust
p[0] ---> | 'M' | 'o' | 'd' | 'e' | '\0' | p[1] ---> | 'W' | 'o' | 'r' | 'l' | 'd' | '\0' |

بمعنى آخر، يمكن تغيير المؤشرات في المصفوفة p لتشير إلى سلاسل نصية مختلفة، ولكن لا يمكن تغيير السلاسل أنفسها. هذا يبرز الفارق بين تعريف المتغير c وتعريف المصفوفة p في لغة البرمجة C وكيفية تأثير ذلك على قابلية التعديل والوصول إلى البيانات في الذاكرة.

زر الذهاب إلى الأعلى