pointers ופונקציות - שאלה

T TECH

New member
pointers ופונקציות - שאלה

מדוע כדי לשנות את הערך של ההמשתנה - שהוכנס כפרמטר אני צריך לרשום
Func (int *a) { *a=6; }​
ולקרוא לפונקציה ככה
Func &someVar;​
ולא
Func (int &a) { *a=6; }​
והקריאה היא אותה קריאה כמו לפונקציה הראשונה. הסבר לדוגמא השניה לפרמטר &a אני מעביר את הכתובת של SomeVar ואז בפונקציה אני משנה את הערך בעזרת * עכשיו הקומפיילר לא נותן לי את האפשרות השניה מישהו יכול להסביר לי למה את הראשונה כן ואת השניה לא? תודה מראש.
 

ilankt

New member
יש לך טעות באפשרות השנייה

באפשרות הראשונה אתה מעביר מצביע, ובאפשרות השנייה אתה מעביר by refrence. כשמשתמשים ב refrence אתה לא צריך לרשום את הכוכבית לפני השם של המשתנה כדי לגשת אליו, כי הוא לא מצביע.
 

ilankt

New member
ובאפשרות השנייה אתה מעביר את המשתנה

רגיל, בלי &.
 

T TECH

New member
קודם כל תודה לכולם בייחוד לכולכם

כולכם עזרתם לי להבין את הטעות שלי. אז ככה: הסימן הזה * או לחלופין האופרטור * בקונטקס של פויינטרים, משמש במקרה אחד כציון שמשתנה הוא פויינטר כמו בדוגמא הבאה
int *pointer;​
ובעצם שמכריזים\יוצרים משתנה חדש אין משמעות לסימן & ובעצם זה יוצר שגיאת תחביר - ופה בעצם טמונה הטעות שלי. מכאן שהפונקציה הבאה היא לא נכונה מכיוון ש& בהכרזת המשתנה הוא לא חוקי וזהו בעצם אינו פוינטר.
Func (int &a){ }​
לעומת זאת הקוד הנכון הוא עם האופרטור * שמסמן לקומפיילר שזהו פויינטר. ואז בעצם בתוך הפונקציה כדי לעבוד עם המשתנה שאליו מצביע הפויינטר יש צורך לסמן בעזרת האופרטור * שאנו מעוניינים בכך לפי הדוגמא הבאה.
*a=69​
בעצם זה עבודה עם פויינטרים. טוב, תודה לכולם על זה שהבאתם אותי להבין את טעותי.
 

tseliot

New member
אתה מתכנת בC או C++?

אם בC אז מה שרשמת נכון, אם בC++ לפונקציה שמקבלת int& יש משמעות...
 

T TECH

New member
כן התכוונתי בC ולפי מה שאתה אני מבי

ן שהסימן & בC++ זה הREF.
 

tseliot

New member
אם הבנתי אותך נכון...

לסימן & יש משמעויות שונות בהתאם לקונטקסט, כמו שהסימן * יכול לציין מצביע או פעולת כפל... הסימן & יכול לציין החזרת הכתובת של משתנה:
int a=0; int* pa; pa=&a;//now pa points to the adress of a;​
או לחילופין הוא יכול לציין משתנה מסוג REFERENCE- כלומר זה משתנה שהינו למעשה "שם נרדף" למשתנה המקורי:
int a=0; int &ra=a;//from this moment on, every operation on ra is the same as applying the same operation on a itself: a=2;//ra=2,a=2; ra=3;//ra=3,a=3;​
לכן למעשה בפונקציה השניה שלך לא אמרת לפונקציה לקבל כארגומנט כתובת של משתנה מסוג INT אלא לקבל REFERENCE לINT. בפונקציה השניה אתה צריך לקרוא לה כך:Func(SomeVar) והקוד בתוכה צריך להיות:
Func (int &a) { a=6; }//you don't need the * before a because a is treated like an int, not like a pointer to an int​
מקווה שהבנת ושגם עניתי על השאלה הנכונה
אם לא אתה מוזמן לשאול עוד...
 

tseliot

New member
אז מה המשמעות של הקוד בC?

או שזה פשוט לא יתקבל על ידי הקומפיילר?
 
למעלה