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; 
c מצביעים

יתרון של מצביע

1) מצביע מקטין את הקוד ו משפר את הביצועים , הוא משמש לאחזור מחרוזות, עצים וכו' ומשמש עם מערכים, מבנים ופונקציות.

2) אנחנו יכולים להחזיר ערכים מרובים מפונקציה באמצעות המצביע.

3) זה גורם לך להיות מסוגל לגשת לכל מיקום זיכרון בזיכרון של המחשב.

קרא את קובץ ה-csv ב-java

שימוש במצביע

ישנם יישומים רבים של מצביעים בשפת 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. אם אין לך כתובת כלשהי לציון במצביע בזמן ההצהרה, תוכל להקצות ערך NULL. זה יספק גישה טובה יותר.

עומס יתר בשיטה
 int *p=NULL; 

ברוב הספריות, הערך של המצביע הוא 0 (אפס).

Pointer Program להחליף שני מספרים מבלי להשתמש במשתנה השלישי.

 #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; } 

תְפוּקָה

 Before swap: *p1=10 *p2=20 After swap: *p1=20 *p2=10 

קריאת עצות מורכבות

ישנם מספר דברים שיש לקחת בחשבון בעת ​​קריאת המצביעים המורכבים ב-C. בואו לראות את העדיפות והאסוציאטיביות של האופרטורים המשמשים לגבי מצביעים.

מַפעִילעֲדִיפוּתאסוציאטיביות
(), []1משמאל לימין
*, מזהה2מימין לשמאל
סוג מידע3-

כאן, עלינו לשים לב לכך,

  • (): אופרטור זה הוא אופרטור סוגריים המשמש להכרזה והגדרת הפונקציה.
  • []: אופרטור זה הוא אופרטור מנוי של מערך
  • * : אופרטור זה הוא אופרטור מצביע.
  • מזהה: זה השם של המצביע. העדיפות תמיד תוקצה לכך.
  • סוג נתונים: סוג נתונים הוא סוג המשתנה שאליו נועד המצביע להצביע. זה כולל גם את השינוי כמו int signed, long וכו').

כיצד לקרוא את המצביע: int (*p)[10].

כדי לקרוא את המצביע, עלינו לראות של-() ו-[] יש קדימות שווה. לכן, יש לשקול כאן את האסוציאטיביות שלהם. האסוציאטיביות היא משמאל לימין, ולכן העדיפות עוברת ל-().

בתוך סוגריים (), לאופרטור מצביע * ולשם המצביע (מזהה) p יש את אותה קדימות. לכן יש להתייחס לאסוציאטיביות שלהם כאן שהיא מימין לשמאל, אז העדיפות הולכת ל-p, והעדיפות השנייה הולכת ל-*.

הקצה את העדיפות השלישית ל-[] מכיוון שלסוג הנתונים יש את העדיפות האחרונה. לכן המצביע ייראה כמו הבא.

סוג תאריך בכתב כתיבה
  • char -> 4
  • * -> 2
  • p -> 1
  • [10] -> 3

המצביע ייקרא כ-p הוא מצביע למערך של מספרים שלמים בגודל 10.

דוגמא

איך לקרוא את המצביע הבא?

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

הֶסבֵּר

מצביע זה ייקרא כ-p הוא מצביע לפונקציה כזו שמקבלת את הפרמטר הראשון כמצביע למערך חד-ממדי של מספרים שלמים בגודל שני והפרמטר השני כמצביע לפונקציה שהפרמטר הוא ריק וסוג ההחזר הוא המספר השלם.