مؤشر (برمجة): الفرق بين النسختين

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