بحثت ولكن لم افهم إلا قليل ولدي بعض اﻷسئلة
لماذا المؤشرات في ++c/c فقط ؟
هل هذا الـ output هو عنوان a في الذاكرة ؟
int a;
cout << &a;
لماذا يتغير الـ output في كل مرة؟
ما الفرق بين & و * و **؟
اكملوا الباقي، وﻻ تنسوا اﻷمثلة :)
بسم الله الرحمن الرحيم
أولًا يجب أن نعرف إن المؤشرات، هي فرع من أفرع التعامل مع الذاكرة.
ففي ذاكرة الحاسوب، تقسم الذاكرة إلى واحدات تسمى بـ "البايت"، هذا البايت هو بحد ذاته يتكون من ثمانية "بتات" (مفردها بت)، والبت هو أصغر وحدة في بناء ذاكرة الحاسوب، وهي تكون إما صفرًا، وإما واحدًا.
وفي نظم الحاسوب الحديث تقسم الذاكرة إلى واحدات، كل وحدة بحجم البايت. ولكل بايت في الذاكرة عنوان.
لنعد إلى لغة السي:
أينما وجدته يقرأ على أنه "عنوان[إسم المتغير]"، ففي مثالك:
cout<<&a;
أنت تطلب من دالة سي أوت أن تطبع عنوان a.
له معنيان: الأول عند إعلان المتغير، مثل: int *a=5; في السطر السابق أعلنا عن مؤشرٍ من نوع int، يؤشر إلى المنطقة في مقطع البيانات، هذه المنطقة تحميل القيمة 5. والمعنى الثاني فهو في باقي أجزاء الشفرة، والذي يقرأ "المنطقة المشار إليها بـ [إسم المتغير]"، ومثال ذلك: int i=5, *pi=&i; *i=10; printf("%d\n,i); ففي الشفرة السابقة، سيكون الخرج هو "10"؛ وتفسير ذلك أننا أعلنا عن متغير أسمه i، ومؤشر اسمه pi، وأسندنا عنوان i، إلى المؤشر pi. وفي السطر الثاني كتبنا ما تفسيره: ساوي المنطقة المشار إليها بـ pi، بـ 10، والمنطقة المشار إليها بـ pi هي في الأساس المكان المخزن فيه قيمة المتغير i.
فالأول يعني مؤشر يؤشر إلى مؤشر آخر. والثانية تعني مؤشر يؤشر إلى مؤشر ثاني، هذا المؤشر الثاني يؤشر إلى مؤشر ثالث. والثالثة على نفس هذا المنوال.
شيء آخر المصفوفات: المصفوفات هي في الحقيقة مؤشرات، ولتفهم الأمر إليك هذا المثال:
#include <stdio.h>
int main(){
char m[]="By the name of Allah\n";
for(int i=0; i<21;i++){
printf("%c",*(m+i));
}
for(int i=0; i<21;i++){
printf("%c",m[i]);
}
char *n="By the name of Allah\n";
for(int i=0; i<21;i++){
printf("%c",*(n+i));
}
for(int i=0; i<21;i++){
printf("%c",n[i]);
}
return 0;
}
إذا ما هو الفرق بين الصيغتين:
*(n+x);
n[x];
تفسير هذين السطرين يكون كالتالي:
*(n+x); // كما هو
*(n+x*(sizeof([type_of_var]))); // type_of_var تعني نوع المتغير
أسأل الله أن يكون هذا الشرح موفقًا، ومفيدًا.
والسلام عليكم، ورحمة الله، وبركاته.
هناك كتيب pdf اسمه "المؤشرات في ++c ما لها وما عليها", وهو من افضل ما قرأته عن موضوع المؤشرات
كان مرفوعاً على سيرفرات الفريق العربي للبرمجة, لكن للاسف يبدو ان الفريق العربي للبرمجة انتهى :( لو وجدته في ارشيفي سأقوم برفعه ان شاء الله.
هذا كتاب يتكلم عن المئشرات
المؤشر هو متغير يشتمل على أحد عناوين الذاكرة... لاحظ أنه يشتمل على أحد عناوين الذاكرة وليس بالتالي قيمة؛
حتى تفهم ما هو المؤشر لنأخذ مثال، مثلا صناديق البريد كما تلاحظ فإن لكل صندوق بريد عنوان أو بالأحرى رقم صندوق لنفرضأ نه يوجد في هذا الصندوق رسالة هذه الرسالة تحوي العدد 2 ، وقد طلب منك طباعة عنوان هذه الرسالة؛ أنت لن تطبع محتوى الرسالة بل ستطبع رقم صندوق البريد أي عنوان تلك الرسالة ؛ وهذا ما يقوم به البرنامج السابق فهو يطبع عنوان المتغير a وليس ما يحويه هذا المتغير...
التعليقات