logo

مؤشرات C

المؤشر في لغة C هو متغير يقوم بتخزين عنوان متغير آخر. يمكن أن يكون هذا المتغير من النوع int، أو char، أو array، أو function، أو أي مؤشر آخر. يعتمد حجم المؤشر على البنية. ومع ذلك، في بنية 32 بت، يكون حجم المؤشر 2 بايت.

خذ بعين الاعتبار المثال التالي لتعريف المؤشر الذي يخزن عنوان عدد صحيح.

 int n = 10; int* p = &n; // Variable p of type pointer is pointing to the address of the variable n of type integer. 

الإعلان عن المؤشر

يمكن الإعلان عن المؤشر في لغة C باستخدام * (رمز النجمة). يُعرف أيضًا باسم مؤشر غير الاتجاه المستخدم لإلغاء الإشارة إلى المؤشر.

 int *a;//pointer to int char *c;//pointer to char 

مثال المؤشر

ويرد أدناه مثال على استخدام المؤشرات لطباعة العنوان والقيمة.

مثال المؤشر

كما ترون في الشكل أعلاه، يقوم متغير المؤشر بتخزين عنوان متغير الرقم، أي fff4. قيمة المتغير الرقمي هي 50. لكن عنوان متغير المؤشر p هو aaa3.

بمساعدة *( عامل غير اتجاهي )، يمكننا طباعة قيمة متغير المؤشر p.

رقم ارمسترونج

دعونا نرى مثال المؤشر كما هو موضح في الشكل أعلاه.

 #include int main(){ int number=50; int *p; p=&number;//stores the address of number variable printf('Address of p variable is %x 
',p); // p contains the address of the number therefore printing p gives the address of number. printf('Value of p variable is %d 
',*p); // As we know that * is used to dereference a pointer therefore if we print *p, we will get the value stored at the address contained by p. return 0; } 

انتاج |

 Address of number variable is fff4 Address of p variable is fff4 Value of p variable is 50 

المؤشر إلى المصفوفة

 int arr[10]; int *p[10]=&arr; // Variable p of type pointer is pointing to the address of an integer array arr. 

مؤشر إلى وظيفة

 void show (int); void(*p)(int) = &display; // Pointer p is pointing to the address of a function 

مؤشر للهيكل

 struct st { int i; float f; }ref; struct st *p = &ref; 
ج مؤشرات

ميزة المؤشر

1) المؤشر يقلل من الكود و يحسن الأداء ، يتم استخدامه لاسترداد السلاسل والأشجار وما إلى ذلك ويستخدم مع المصفوفات والهياكل والوظائف.

2) نستطيع إرجاع قيم متعددة من دالة باستخدام المؤشر.

جافا ريكس ل

3) يجعلك قادرًا على ذلك الوصول إلى أي موقع الذاكرة في ذاكرة الكمبيوتر.

استخدام المؤشر

هناك العديد من تطبيقات المؤشرات في لغة C.

1) تخصيص الذاكرة الديناميكية

في لغة C، يمكننا تخصيص الذاكرة ديناميكيًا باستخدام وظائف malloc() وcalloc() حيث يتم استخدام المؤشر.

2) المصفوفات والوظائف والهياكل

تُستخدم المؤشرات في لغة C على نطاق واسع في المصفوفات والوظائف والهياكل. فهو يقلل من الكود ويحسن الأداء.

عنوان (&) المشغل

عنوان عامل التشغيل '&' يُرجع عنوان المتغير. لكننا نحتاج إلى استخدام %u لعرض عنوان المتغير.

 #include int main(){ int number=50; printf('value of number is %d, address of number is %u',number,&number); return 0; } 

انتاج |

 value of number is 50, address of number is fff4 

مؤشر فارغ

المؤشر الذي لم يتم تعيين أي قيمة له ولكن NULL يُعرف بالمؤشر NULL. إذا لم يكن لديك أي عنوان ليتم تحديده في المؤشر في وقت الإعلان، فيمكنك تعيين قيمة NULL. وسوف توفر نهجا أفضل.

 int *p=NULL; 

في معظم المكتبات، تكون قيمة المؤشر 0 (صفر).

برنامج المؤشر لتبديل رقمين دون استخدام المتغير الثالث.

 #include int main(){ int a=10,b=20,*p1=&a,*p2=&b; printf('Before swap: *p1=%d *p2=%d',*p1,*p2); *p1=*p1+*p2; *p2=*p1-*p2; *p1=*p1-*p2; printf('
After swap: *p1=%d *p2=%d',*p1,*p2); return 0; } 

انتاج |

Arraylist مرتبة Java
 Before swap: *p1=10 *p2=20 After swap: *p1=20 *p2=10 

قراءة المؤشرات المعقدة

هناك العديد من الأشياء التي يجب أن تؤخذ بعين الاعتبار أثناء قراءة المؤشرات المعقدة في لغة C. دعونا نرى الأسبقية والترابط بين العوامل المستخدمة فيما يتعلق بالمؤشرات.

نموذج TCP وIP
المشغل أو العاملالأولويةالترابط
()، []1من اليسار إلى اليمين
* معرف2من اليمين الى اليسار
نوع البيانات3-

وهنا يجب أن نلاحظ أن،

  • (): هذا العامل هو عامل قوس يستخدم للإعلان عن الوظيفة وتعريفها.
  • []: هذا العامل هو عامل تشغيل منخفض للصفيف
  • *: هذا العامل هو عامل المؤشر.
  • المعرف: هو اسم المؤشر. سيتم دائمًا تعيين الأولوية لهذا.
  • نوع البيانات: نوع البيانات هو نوع المتغير الذي يهدف المؤشر إلى الإشارة إليه. ويتضمن أيضًا المُعدِّل مثل Signed Int وLong وما إلى ذلك).

كيفية قراءة المؤشر: int (*p)[10].

لقراءة المؤشر، يجب أن نرى أن () و [] لهما نفس الأسبقية. ولذلك، يجب النظر في ارتباطهم هنا. يتم الاقتران من اليسار إلى اليمين، وبالتالي فإن الأولوية تذهب إلى ().

داخل القوس ()، مشغل المؤشر * واسم المؤشر (المعرف) p لهما نفس الأسبقية. لذلك، يجب مراعاة ارتباطهم هنا الذي من اليمين إلى اليسار، فتذهب الأولوية إلى p، والأولوية الثانية إلى *.

قم بتعيين الأولوية الثالثة لـ [] نظرًا لأن نوع البيانات له الأولوية الأخيرة. لذلك سيبدو المؤشر كما يلي.

  • شار -> 4
  • * -> 2
  • ع -> 1
  • [10] -> 3

ستتم قراءة المؤشر على أنه p هو مؤشر إلى مجموعة من الأعداد الصحيحة بحجم 10.

مثال

كيف تقرأ المؤشر التالي؟

 int (*p)(int (*)[2], int (*)void)) 

توضيح

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