C++/מצביעים והמשתנה הפניה: הבדלים בין גרסאות בדף

תוכן שנמחק תוכן שנוסף
Hagai (שיחה | תרומות)
אין תקציר עריכה
Shrek0100 (שיחה | תרומות)
תיקון פסקת ה-"מהו מצביע?" ומספר דוגמאות קוד. , הרחבה, עריכה
שורה 1:
{{C++‎}}
==מהו מצביע?==
מצביע הוא משתנה המכיל כתובת זיכרון. בעזרת מצביעים ניתן לגשת לכתובות בזיכרון, לקרוא מהן, ולכתוב אליהן. בעזרת המשתנים ניתן לחסוך בזיכרון ולהעביר כתובות של עצמים במקום ליצור אותם שוב ושוב. כמו כן, המצביעים נותנים לנו אפשרויות לניהול זיכרון גמישות יותר.
מצביע הוא הקצאת מקום בזיכרון שבתוכו ישנה כתובת(מיקום בזיכרון) של משתנה אחר.
<source lang="cppc++">
לדוגמא:
<source lang="cpp">
int *num=7;
</source>
במקרה הנ"ל, אני מגדירים מצביע מסוג int (כלומר, הוא מצביע לשטח בזיכרון בגודל של int). מצביע זה מצביע על הכתובת 7 בזיכרון.
במקרה הנ"ל מה שישמר בזיכרון הוא כתובת שבה יש 7.
להלן דוגמה להגדרת מצביע המצביע לכתובת של משתנה אחר:<syntaxhighlight lang="c++">
מה שקורה זה שהמחשב מסתכל במצביע, רואה את הכתובת, מסתכל בכתובת ורואה את השבע.
char c = 'A';
char *p = &c;
</syntaxhighlight>גישה למשתנה תתצבע באמצעות הוספת כוכבית (*) לפני שם המצביע. לדוגמה, בהמשך לדוגמת הקוד הקודמת נוכל לשנות את תוכנות של המצביע באמצעות:<syntaxhighlight lang="c++">
*p = 'B';
</syntaxhighlight>
==מהו משתנה מיוחס?==
המשתנה המיוחס פועל בדומה למצביע ובא במקרים מסוימים להחליף אותו.<br /> למשתנה המיוחס כמה יתרונות וחסרונות לעומת המצביע. גם בעזרתו ניתן להשפיע בעקיפין על משתנה אחר, אלא שהוא חוסך את הכתיבה המסורבלת של אופרטורים נוספים. אפשר להבין אותו גם כשם חדש למשתנה שכבר הוכרז בזיכרון.
שורה 13 ⟵ 17:
==יישום בדוגמה פשוטה==
הבה נגדיר משתנה מיוחס:
<source lang="cppc++">
int &ref;
</source>
שורה 19 ⟵ 23:
בדומה למקרה של הכרזת מצביע, שם נקדים את התו *.<br />
כעת נייחס את המשתנה המתייחס למשתנה רגיל אחר:
<source lang="cppc++">
int num;
ref=num;
שורה 25 ⟵ 29:
שימו לב: לא התרחשה כאן השמת ערכים, אלא ייחוס של המשתנה ref למשתנה num, כזה ייחוס אגב, יכול להתרחש רק פעם אחת בחייו של משתנה מיוחס.
עכשיו אם נשנה את ערכו של ref, ישתנה גם ערכו של num, וכך גם ההפך:
<source lang="cppc++">
ref=10;
cout << num;
שורה 36 ⟵ 40:
כמו שאמרנו קודם, השימוש העיקרי של משתנים מתייחסים, כמו של מצביעים, הוא בפונקציות.
לדוגמה, נכתוב פונקציה שמחליפה בין ערכיהם של שני משתנים בשם ()swap:
<source lang="cppc++">
#include<iostream.h>
 
שורה 56 ⟵ 60:
b=temp;
}
 
</source>
שימו לב שהפרמטרים המועברים לפונקציה, הם ללא שום אופרטור מצביע.<br /> ובכל זאת הפונקציה משפיעה על המשתנים num1 וnum2 שנמצאים בתוכנית.<br /> בתוך הפונקציה, הגישה לפרמטרים a ו b היא שגרתית כאילו הם משתנים רגילים, לאחר שכל אחד מהם כבר מתייחס למשתנה שנשלח לו, בהתאמה.<br />הפונקציה כמובן אינה מחזירה כלום ולכן מוגדרת כvoid. <br />
שורה 62 ⟵ 65:
==משתנים מתייחסים כערכים מוחזרים==
ניתן לייצור משתנה מיוחס, שיוחזר מפונקציה (כאן num הוא משתנה גלובלי כלשהו):
<source lang="cppc++">
int &getnum()
{
שורה 71 ⟵ 74:
הטיפוס המוחזר של הפונקציה ()getnum הוא משתנה מיוחס של int.
אפשר להשתמש בפונקציה בכדי לקבל את ערכו של num כך:
<source lang="cppc++">
cout << getnum();
</source>
פעולה כזאת אפשרית גם ללא משתנים מתייחסים, ולכן דרך יותר מעניינת היא, להציב ערך לnum דרך הפונקציה:
<source lang="cppc++">
getnum()=50;
</source>