שאלה על פוינטרים

matliv

New member
שאלה על פוינטרים

זה פועל טוב:
#include <iostream.h> void change(int *); int main() { int a=5; change(&a); cout<<"\nnew value of a is "<<a; return 0; } void change(int *p) { *p=*p+1; }​
השאלה, למה זה לא פועל טוב? נראה שאין הבדל!
#include <iostream.h> void change(int *); int main() { int a=5; change(&a); cout<<"\nnew value of a is "<<a; return 0; } void change(int *p) { *p++; }​
בסך הכל שיניתי בפונקציה את השורה האחרונה, ואני לא מבין למה זה משפיע?
 

sbennys

New member
תגובה

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

gmorphus

New member
מסקנה

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