C++/מצביעים והמשתנה המיוחס

מתוך ויקיספר, אוסף הספרים והמדריכים החופשי
< C++
קפיצה לניווט קפיצה לחיפוש

מהו מצביע?[עריכה]

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

int *num=7;

במקרה הנ"ל, אנו מגדירים מצביע מסוג int (כלומר, הוא מצביע לשטח בזיכרון בגודל של int). מצביע זה מצביע על הכתובת 7 בזיכרון.

להלן דוגמה להגדרת מצביע המצביע לכתובת של משתנה אחר:

char c = 'A';
char *p = &c;

גישה למשתנה תתצבע באמצעות הוספת כוכבית (*) לפני שם המצביע. לדוגמה, בהמשך לדוגמת הקוד הקודמת נוכל לשנות את תוכנו של המצביע באמצעות:

*p = 'B';

מהו משתנה מיוחס?[עריכה]

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

יישום בדוגמה פשוטה[עריכה]

הבה נגדיר משתנה מיוחס:

int num;
int &ref=num;

למשתנה המיוחס קראנו ref, הכרזנו אותו כמתייחס לטיפוס int, והקדמנו לשמו את התו &. בדומה למקרה של הכרזת מצביע, שם נקדים את התו *.
ייחסנו את המשתנה ref למשתנה num. שימו לב: לא התרחשה כאן השמת ערכים, אלא ייחוס של המשתנה ref למשתנה num, כזה ייחוס אגב, יכול להתרחש רק פעם אחת בחייו של משתנה מיוחס, וחייב להתבצע בהכרזה שלו. עכשיו אם נשנה את ערכו של ref, ישתנה גם ערכו של num, וכך גם ההפך:

ref=10;
cout << num; //10
num=20;
cout << ref; //20

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

שימוש בפונקציות[עריכה]

כמו שאמרנו קודם, השימוש העיקרי של משתנים מתייחסים, כמו של מצביעים, הוא בפונקציות. לדוגמה, נכתוב פונקציה שמחליפה בין ערכיהם של שני משתנים בשם ()swap:

#include<iostream.h>

void swap(int &a,int &b);

int main()
{
int num1=5,num2=10;
swap(num1,num2);
cout << num1 << endl << num2;
return 0;
}

void swap(int &a,int &b)
{
int temp;
temp=a;
a=b;
b=temp;
}

שימו לב שהפרמטרים המועברים לפונקציה, הם ללא שום אופרטור מצביע.
ובכל זאת הפונקציה משפיעה על המשתנים num1 וnum2 שנמצאים בתוכנית.
בתוך הפונקציה, הגישה לפרמטרים a ו b היא שגרתית כאילו הם משתנים רגילים, לאחר שכל אחד מהם כבר מתייחס למשתנה שנשלח לו, בהתאמה.
הפונקציה כמובן אינה מחזירה כלום ולכן מוגדרת כvoid.

משתנים מתייחסים כערכים מוחזרים[עריכה]

ניתן לייצור משתנה מיוחס, שיוחזר מפונקציה (כאן num הוא משתנה גלובלי כלשהו):

int &getnum()
{
int &ref=num;
return ref;
}

הטיפוס המוחזר של הפונקציה ()getnum הוא משתנה מיוחס של int. אפשר להשתמש בפונקציה בכדי לקבל את ערכו של num כך:

cout << getnum();

פעולה כזאת אפשרית גם ללא משתנים מתייחסים, ולכן דרך יותר מעניינת היא, להציב ערך לnum דרך הפונקציה:

getnum()=50;

עכשיו ערכו של num הוא 50.


הפרק הקודם:
פונקציות
מצביעים והמשתנה המיוחס הפרק הבא:
מבנים ואיגודים