المؤشرات في لغة C: ما هو المؤشر في برمجة C؟ أنواع

ما هو المؤشر في لغة C؟

مؤشر في C، هو متغير يخزن عنوان متغير آخر. يمكن أيضًا استخدام المؤشر للإشارة إلى وظيفة مؤشر أخرى. يمكن زيادة/إنقاص المؤشر، أي للإشارة إلى موقع الذاكرة التالي/السابق. الغرض من المؤشر هو توفير مساحة الذاكرة وتحقيق وقت تنفيذ أسرع.

كيفية استخدام المؤشرات في C

إذا أعلنا عن متغير v من النوع int، فسيقوم v بالفعل بتخزين قيمة.

كيفية استخدام المؤشرات في C

v يساوي الصفر الآن.

ومع ذلك، كل متغير، بصرف النظر عن القيمة، له عنوانه أيضًا (أو ببساطة، مكان وجوده في الذاكرة). يمكن استرداد العنوان عن طريق وضع علامة العطف (&) قبل اسم المتغير.

كيفية استخدام المؤشرات في C

إذا قمت بطباعة عنوان متغير على الشاشة، فسيبدو كرقم عشوائي تمامًا (علاوة على ذلك، يمكن أن يختلف من تشغيل لآخر).

دعونا نجرب ذلك عمليا باستخدام المؤشر في مثال C

كيفية استخدام المؤشرات في C

إخراج هذا البرنامج هو -480613588.

والآن ما هو المؤشر؟ بدلاً من تخزين قيمة، سيقوم المؤشر بتخزين عنوان المتغير.


متغير المؤشر

Int *y = &v;

متغير POINTER
A قيمنا المخزنة في عين عنوان التخزين/الذاكرة A متغير أن نقاط ل عنوان التخزين/الذاكرة الخاص بـ طرق متغير

إعلان المؤشر

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

data_type * pointer_variable_name;

هنا،

  • نوع البيانات هو النوع الأساسي للمؤشر لأنواع متغيرات C ويشير إلى نوع المتغير الذي يشير إليه المؤشر.
  • العلامة النجمية (*: نفس العلامة النجمية المستخدمة في الضرب) وهي عامل غير اتجاهي، declares مؤشر.

دعونا نرى بعض إعلانات المؤشر الصالحة في هذا البرنامج التعليمي لمؤشرات C:

int    *ptr_thing;            /* pointer to an integer */ 
int *ptr1,thing;/* ptr1 is a pointer to type integer and thing is an integer variable */
double    *ptr2;    /* pointer to a double */
float    *ptr3;      /* pointer to a float */
char    *ch1 ;       /* pointer to a character */
float  *ptr, variable;/*ptr is a pointer to type float and variable is an ordinary float variable */

تهيئة المؤشر

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

للحصول على عنوان متغير، نستخدم عامل علامة الضم (&) الموضوع قبل اسم المتغير الذي نحتاج إلى عنوانه. تتم تهيئة المؤشر باستخدام المتابعةwing بناء الجملة.

بناء جملة المؤشر

 pointer = &variable;

ويرد أدناه برنامج بسيط لتوضيح المؤشر:

#include <stdio.h>
int main()
{
   int a=10;    //variable declaration
   int *p;      //pointer variable declaration
   p=&a;        //store address of variable a in pointer p
   printf("Address stored in a variable p is:%x\n",p);  //accessing the address
   printf("Value stored in a variable p is:%d\n",*p);   //accessing the value
   return 0;
}

الإخراج:

Address stored in a variable p is:60ff08
Value stored in a variable p is:10
المُشغل معنى
* يخدم غرضين

  1. إعلان المؤشر
  2. إرجاع قيمة المتغير المشار إليه
& يخدم غرضًا واحدًا فقط

  • إرجاع عنوان المتغير

أنواع المؤشرات في C

فولوwing هي مختلفة أنواع المؤشرات في C:

مؤشر فارغ

يمكننا إنشاء مؤشر فارغ عن طريق تعيين قيمة فارغة أثناء إعلان المؤشر. تكون هذه الطريقة مفيدة عندما لا يكون لديك أي عنوان مخصص للمؤشر. يحتوي المؤشر الفارغ دائمًا على القيمة 0.

فولوwing يوضح البرنامج استخدام مؤشر فارغ:

#include <stdio.h>
int main()
{
	int *p = NULL; 	//null pointer
	printf(“The value inside variable p is:\n%x”,p);
	return 0;
}

الإخراج:

The value inside variable p is:
0

مؤشر الفراغ

In البرمجة C، يُطلق على المؤشر الفارغ أيضًا اسم المؤشر العام. ليس لديها أي نوع بيانات قياسي. يتم إنشاء مؤشر فارغ باستخدام الكلمة الأساسية فارغة. ويمكن استخدامه لتخزين عنوان أي متغير.

فولوwing يوضح البرنامج استخدام مؤشر فارغ:

#include <stdio.h>
int main()
{
void *p = NULL; 	//void pointer
printf("The size of pointer is:%d\n",sizeof(p));
return 0;
}

الإخراج:

The size of pointer is:4

المؤشر البري

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

فولوwing يوضح البرنامج استخدام المؤشر البري:

#include <stdio.h>
int main()
{
int *p; 	//wild pointer
printf("\n%d",*p);
return 0;
}

الإخراج:

timeout: the monitored command dumped core
sh: line 1: 95298 Segmentation fault      timeout 10s main

الأنواع الأخرى من المؤشرات في "c" هي كما يلي:

  • المؤشر المتدلي
  • معplex مؤشر
  • بالقرب من المؤشر
  • المؤشر البعيد
  • مؤشر ضخم

مؤشرات الوصول المباشر وغير المباشر

في لغة C، هناك طريقتان متكافئتان للوصول إلى المحتوى المتغير ومعالجته

  • الوصول المباشر: نستخدم اسم المتغير مباشرة
  • الوصول غير المباشر: نستخدم مؤشرًا للمتغير

دعونا نفهم هذا بمساعدة البرنامج أدناه

#include <stdio.h>
/* Declare and initialize an int variable */
int var = 1;
/* Declare a pointer to int */
int *ptr;
int main( void )
{
/* Initialize ptr to point to var */
ptr = &var;
/* Access var directly and indirectly */
printf("\nDirect access, var = %d", var);
printf("\nIndirect access, var = %d", *ptr);
/* Display the address of var two ways */
printf("\n\nThe address of var = %d", &var);
printf("\nThe address of var = %d\n", ptr);
/*change the content of var through the pointer*/
*ptr=48;
printf("\nIndirect access, var = %d", *ptr);
return 0;}

وبعد تجميع البرنامج بدون أي أخطاء تكون النتيجة:

Direct access, var = 1
Indirect access, var = 1

The address of var = 4202496
The address of var = 4202496

Indirect access, var = 48

المؤشر الحسابي في C

يتم تلخيص عمليات المؤشر في المتابعةwing الشكل

المؤشر الحسابي في C
عمليات المؤشر

عملية الأولوية (الأسبقية)

عند العمل مع مؤشرات C، يجب أن نلاحظ ما يليwing قواعد الأولوية:

  • العوامل * و & لها نفس الأولوية مثل العوامل الأحادية (النفي!، الزيادة++، النقصان–).
  • في نفس التعبير، يتم تقييم العوامل الأحادية *، &،!، ++، – من اليمين إلى اليسار.

إذا كان مؤشر P يشير إلى متغير X، فيمكن استخدام * P أينما يمكن كتابة X.

التاليwing التعبيرات متكافئة:

int X =10
int *P = &Y;
For the above code, below expressions are true
التعبير التعبير المعادل
ص=*ف+1

*ف=*ف+10

*ف+=2

+***ص

(*ع)++

ص=س+1

س=س+10

س+=2

++X

X ++

في الحالة الأخيرة، تكون هناك حاجة إلى أقواس: حيث يتم تقييم العوامل الأحادية * و++ من اليمين إلى اليسار، وبدون الأقواس سيزداد المؤشر P، وليس الكائن الذي يشير P إليه.

يوضح الجدول أدناه العملية الحسابية والأساسية التي يمكن استخدامها عند التعامل مع مؤشرات C

عملية تفسير
مهمة كثافة العمليات *P1،*P2
P1=P2;
يشير P1 وP2 إلى نفس المتغير الصحيح
الزيادة والنقصان إنت *P1؛
P1++;P1– ;
إضافة إزاحة (ثابت) يسمح هذا للمؤشر بتحريك عناصر N في الجدول.
سيتم زيادة أو تقليل المؤشر بمقدار N أضعاف عدد البايتات (البايتات) من نوع المتغير.
P1+5؛

مؤشرات ومصفوفات C مع أمثلة

تقليديًا، يمكننا الوصول إلى عناصر المصفوفة باستخدام فهرسها، ولكن يمكن حذف هذه الطريقة باستخدام المؤشرات. تسهل المؤشرات الوصول إلى كل عنصر من عناصر المصفوفة.

#include <stdio.h>
int main()
{
    int a[5]={1,2,3,4,5};   //array initialization
    int *p;     //pointer declaration
               /*the ptr points to the first element of the array*/

    p=a; /*We can also type simply ptr==&a[0] */
    
    printf("Printing the array elements using pointer\n");
    for(int i=0;i<5;i++)    //loop for traversing array elements
    {
        	printf("\n%x",*p);  //printing array elements
        	p++;    //incrementing to the next element, you can also write p=p+1
    }
    return 0;
}

الإخراج:

1
2
3
4
5

ستؤدي إضافة رقم معين إلى المؤشر إلى نقل موقع المؤشر إلى القيمة التي تم الحصول عليها من خلال عملية الإضافة. لنفترض أن p هو مؤشر يشير حاليًا إلى موقع الذاكرة 0 إذا قمنا بإجراء المتابعةwing عملية الجمع، p+1، سيتم تنفيذها بهذه الطريقة:

المؤشرات والمصفوفات C

إضافة/زيادة المؤشر

نظرًا لأن p يشير حاليًا إلى الموقع 0 بعد إضافة 1، فستصبح القيمة 1، وبالتالي سيشير المؤشر إلى موقع الذاكرة 1.

مؤشرات وسلاسل C مع أمثلة

السلسلة عبارة عن مصفوفة من كائنات char، تنتهي بحرف فارغ '\ 0'. يمكننا التعامل مع السلاسل باستخدام المؤشرات. يشرح هذا المؤشر في مثال C هذا القسم

#include <stdio.h>
#include <string.h>
int main()
{
char str[]="Hello Guru99!";
char *p;
p=str;
printf("First character is:%c\n",*p);
p =p+1;
printf("Next character is:%c\n",*p);
printf("Printing all the characters in a string\n");
p=str;  //reset the pointer
for(int i=0;i<strlen(str);i++)
{
printf("%c\n",*p);
p++;
}
return 0;
}

الإخراج:

First character is:H
Next character is:e
Printing all the characters in a string
H
e
l
l
o

G
u
r
u
9
9
!

هناك طريقة أخرى للتعامل مع السلاسل وهي استخدام مجموعة من المؤشرات كما هو موضح في الصفحة التاليةwing :

#include <stdio.h>
int main(){
char *materials[ ] = {  "iron",  "copper",  "gold"};
printf("Please remember these materials :\n");
int i ;
for (i = 0; i < 3; i++) {
  printf("%s\n", materials[ i ]);}
  return 0;}

الإخراج:

Please remember these materials:
iron
copper
gold

مزايا المؤشرات في C

  • المؤشرات مفيدة للوصول إلى مواقع الذاكرة.
  • توفر المؤشرات طريقة فعالة للوصول إلى عناصر بنية الصفيف.
  • يتم استخدام المؤشرات لتخصيص الذاكرة الديناميكية بالإضافة إلى إلغاء التخصيص.
  • يتم استخدام المؤشرات لتشكيل complex هياكل البيانات مثل القائمة المرتبطة والرسم البياني والشجرة وما إلى ذلك.

مساوئ المؤشرات في C

  • المؤشرات قليلا كومplex لفهم.
  • يمكن أن تؤدي المؤشرات إلى أخطاء مختلفة مثل أخطاء التجزئة أو يمكنها الوصول إلى موقع الذاكرة غير المطلوب على الإطلاق.
  • إذا تم توفير قيمة غير صحيحة للمؤشر، فقد يتسبب ذلك في تلف الذاكرة.
  • المؤشرات مسؤولة أيضًا عن تسرب الذاكرة.
  • المؤشرات أبطأ نسبيًا من مؤشرات المتغيرات.
  • يجد المبرمجون صعوبة بالغة في العمل باستخدام المؤشرات؛ لذلك تقع على عاتق المبرمج مسؤولية التعامل مع المؤشر بعناية.

نبذة عامة

  • المؤشر ليس سوى موقع في الذاكرة حيث يتم تخزين البيانات.
  • يتم استخدام المؤشر للوصول إلى موقع الذاكرة.
  • هناك أنواع مختلفة من المؤشرات مثل المؤشر الفارغ والمؤشر البري والمؤشر الفارغ وأنواع أخرى من المؤشرات.
  • يمكن استخدام المؤشرات مع المصفوفة والسلسلة للوصول إلى العناصر بشكل أكثر كفاءة.
  • يمكننا إنشاء مؤشرات دالة لاستدعاء دالة ديناميكيًا.
  • يمكن إجراء العمليات الحسابية على المؤشر وهو ما يعرف بحساب المؤشر.
  • يمكن أن تشير المؤشرات أيضًا إلى وظيفة مما يجعل من السهل استدعاء وظائف مختلفة في حالة تحديد مجموعة من المؤشرات.
  • عندما تريد التعامل مع نوع بيانات متغير مختلف، يمكنك استخدام مؤشر الكتابة الفارغ.