مؤشر (برمجة): الفرق بين النسختين
[مراجعة غير مفحوصة] | [مراجعة غير مفحوصة] |
تم حذف المحتوى تمت إضافة المحتوى
ط روبوت: تغييرات تجميلية |
ط تدقيق إملائي وتنسيق, |
||
سطر 1:
في [[حوسبة|الحوسبة]] أو علوم الحاسوب، '''المؤشر''' هو نوع من أنواع البيانات في بعض [[لغة برمجة|لغات البرمجة]] تمثل قيمته (أو تشير إلى) قيمة أخرى مخزنة في مكان آخر في ذاكرة [[حاسوب|الحاسوب]]، وذلك باستخدام عنوان الذاكرة لها.
عملية الحصول على القيمة التي يشير إليها المؤشر تسمى تتبع المؤشر dereferencing. يعتبر المؤشر تطبيق بسيط لنوع البيانات العام المرجع برغم أنه مختلف عن الوسيلة المسماة مرجع reference في لغة [[سي++]]
تفيد المؤشرات إلى البيانات في تحسين الأداء للعمليات المتكررة مثل تمرير [[سلسلة حرفية|السلاسل الحرفية]] و[[بنية|تراكيب]] (بنيات) [[شجرة بيانات|الأشجار]]
في حين أن المؤشرات قد استخدمت لتمثل المراجع عموماً إلا أنها تنطبق بشكل أكثر ملاءمة على تراكيب البيانات التي تسمح واجهتها بوضوح للمؤشر أن يعالج بوصفه عنوان ذاكرة. ولأن المؤشرات تسمح بالوصول الغير محمي بشكل واسع لعناوين الذاكرة فإن هناك بعض الخطورة المصاحبة لاستخدامها.
سطر 13:
في لغات البرمجة المعتمدة على الدوال والتي تستند بشكل كبير إلى القوائم؛ يتم التحكم بالمؤشرات والمراجع من اللغة باستخدام التركيبات الداخلية مثل cons.
عند التعامل مع [[مصفوفة|المصفوفات]]
تستخدم المؤشرات في تمرير المعاملات باستخدام مراجع لها، ويكون هذا مفيداً إذا أردنا أن يكون تعديل الدالة للمعامل مرئياً للجزء الذي قام باستدعائها. وهذا مفيد أيضا في إرجاع عدة قيم من دالة.
سطر 22:
<source lang="C">int *money; </source>
حيث يقوم هذا بالإعلان عن <code>money</code> كمؤشر إلى عدد صحيح.
وحيث أن محتويات الذاكرة لا يضمن ما هي القيمة التي من الممكن أن تحتويها في لغة السي، فيجب توخي الحذر للتأكد من أن العنوان الذي يشير إليه <code>money</code> هو عنوان
<source lang="C">int *money = NULL;</source>
سطر 33:
money = &a;
</source>
ويقوم هذا بإسناد عنوان الذاكرة للمتغير الصحيح a إلى قيمة المؤشر
ولتتبع المؤشر يتم استخدام علامة النجمة * مرة أخرى:
<source lang="C">*money = 8;</source>
ويخبر هذا مترجم الكود بأن يأخذ محتويات المؤشر money والتي هي
بعد ذلك إذا تم الدخول إلى a فسنجد قيمته 8.
ربما يكون هذا المثال أكثر وضوحا إذا تم فحص الذاكرة مباشرة.
افترض أن a له عنوان الذاكرة 0x8130 و money له العنوان
<source lang="C">
سطر 95:
*(array + i)
</source>
وبهذا في لغة سي يمكن اعتبار المصفوفات كمؤشرات لمناطق متتابعة من الذاكرة (ليس بينها فجوات)، والصيغة المستخدمة في الوصول إلى المصفوفات مماثلة لتلك المستخدمة في تتبع
<source lang="C">
int array[5]; /* تعلن عن 5 أعداد صحيحة متتالية (
int *ptr = array; /* يمكن استخدام المصفوفات كمؤشرات */
ptr[0] = 1; /* يمكن فهرسة المؤشرات بصيغة المصفوفات */
سطر 104:
ويقوم هذا بحجز موقع في الذاكرة لخمسة أعداد صحيحة ويعلن عن array كمؤشر لهذا الموقع، ومن الاستخدامات الشائعة الأخرى للمؤشرات هي الإشارة [[حجز ذاكرة ديناميكيا|للذاكرة المحجوزة ديناميكيا]] باستخدام دالة [[malloc]] والتي ترجع قطعة متصلة من الذاكرة بما لا يقل عن الحجم المطلوب الذي يمكن استخدامه كمصفوفة.
في حين أن معظم المؤثرات على المؤشرات والمصفوفات متكافئة إلا أنه من المهم أن نذكر أن دالة sizeof سوف تختلف. في هذا المثال <code>sizeof(array)</code> سوف تكون قيمتها <code>5*sizeof(int)</code> أي أن حجم المصفوفة 5×حجم متغير العدد
يمكن الإعلان عن القيم الافتراضية لمصفوفة مثل:
سطر 110:
int array[5] = {2,4,3,1,5};
</source>
إذا فرضت أن array تقع في الذاكرة بدءً من العنوان 0x1000 على حاسوب 32 بت
:{| class="wikitable"
|-
سطر 127:
ويمثل الشكل 5 أعداد صحيحة 2 و4 و3 و1 و5.
هذه الأعداد الصحيحة الخمسة تشغل 32 بت (4بايت)
الصيغة العامة في لغة سي مع المؤشرات هي:
* <code>array</code> تعني 0x1000
* <code>array+1</code> تعني
* <code>*array</code> تعني تتبع محتويات array بما يعني اعتبار المحتويات كعنوان الذاكرة (0x1000) والذهاب والبحث عن القيمة في ذلك العنوان (0x1000).
* <code>array[i]</code> تعني القسم i من المصفوفة والذي يترجم إلى <code>*(array + i)</code>.
سطر 159:
== التمرير باستخدام مرجع ==
يمكن استخدام المؤشرات لتمرير المتغيرات باستخدام مراجع
<source lang="C">
void not_alter(int n) {
|