![]() |
|
(Pointers) םיעיבצמ - C/C++ | |
![]() |
|
ישאר דומע | סינוקא ןד תאמ |
![]() |
.םיתב 2 ספות עיבצמ ןכלו DOS תביבסל ודוסימ בתכנ הז ךירדמ :הרעה .עיבצמ ספות ותוא עובק םיתב רפסמ שי הלעפהה תוכרעמ לכל .ןורכיזב רחא הנתשמ לש תבותכ םכותב ליכהל ודעונ רשא ,ןורכיזב םידחוימ םינתשמ םה םיעיבצמ .(ולש סופיטה המ הנשמ אל) םיתב 2 לש עובק לדוג לעב אוה עיבצמ הנתשמ !דבלב סופיט ותואמ הנתשמ לע עיבצהל לוכי עיבצמ :םירוטרפוא ...לש ןורכיזב תבותכה - & ...י"ע תעבצומה תבותכה לש ךרעה - * .ותרדגה תעב עיבצמ הנתשמ לע הדיעמ ,ןכ ומכ :אמגודל int *p; .int גוסמ םינותנ לע קרו ךא עיבצהל לוכיה םיתב 2 לעב הנתשמ ןורכיזב תרצוי p עיבצמה תרדגה .תיבכוכ םדקמב אלו ומשב קר שמתשנ ,והשלכ ךרע עיבצמל תתל הצרנשכ ,תינכותה ךשמהב : (וילע עיבצי p-ש הצרנו a םשב int הנתשמ ןורכיזב רדגומש חיננ) אמגוד p=&a; .ןורכיזב a הנתשמה לש תבותכה אוהש ךרע ליכמ p ,ונלש הרקמב הרהבה עיבצמ לחתאל דאמ בושח ןכל .ןורכיזב יארקא םוקמ לע עיבצמ אוהו לחתואמ וניא עיבצמה ,עיבצמה תרדגה םע .עיבצמ אוה וילע תבותכל היינפ ינפל תבותכ םע :אמגוד int *p; *p=2; .וב שומישה ינפל עיבצמל תבותכ ךרע תתל אוה תושעל ןוכנה רבדה :אמגוד int a=2, *p=&a; :p תועצמאב a-ל סחייתהל לכונ וישכע *p=3; :(החנה ןה ןורכיזב תובותכ) ךכ הארנ הז ןורכיזב ![]() :תואמגוד .( 2000 - ל"נה בצמב) ןורכיזב a הנתשמה לש תבותכה - &a .( 3000- ל"נה בצמב) ןורכיזב p (עיבצמ) הנתשמה לש תבותכה - &p .(*p=3 ןכלו a-ל עיבצמ p ,ל"נה בצמב) .p עיבצמ הילע תבותכב אצמנש ךרעה - *p .יהשלכ תבותכ ןכותל סחייתהל לכונ אל ןכלו תבותכל עיבצמ אל אוה a !תועט - *a םיכרעמל םיעיבצמ ןיב רשקה .םיאתה תצובק לש ןושארה אתה לש ותבותכ תא ליכמ רשא עיבצמ םירידגמ השעמל ,ךרעמ םירידגמשכ :אמגודל char str[10]; .רחא סופיטמ הנתשמ לע עיבצהל לוכי וניאו char גוסמ אוה str עיבצמהש ,רוכזל שי :(4000 תבותכב הליחתמ םירביאה תצובקש החנהב) ךכ הארנ הז ןורכיזב ![]() עיבצמל םורגל לכונ אל ,ןכל .ליכמ אוה ותוא תבותכה תא תונשל ונתלוכיב ןיא .יטטס עיבצמ הרידגמ ךרעמ תרדגה .ןורכיזב רחא םוקמל עיבצהל str :לשמל .סקדיאבו עיבצמה םשב שמתשהל םילוכי ונא ,(תזורחמה וא) ךרעמה יאתמ דחא לא תשגל םיצור ונאשכ str[2]='a'; ." 'a' תואה תא :איה ךרעמב n-ה רביאל הינפל תיללכה החסונה *(str + n * size_of_type) = ...; .* רוטרפואב שמתשהל ונילע ,וז תבותכל תונפל ידכו ,תבותכ אוה םיירגוסה ךותב אצמנש ךרעה :ךכ תאז עצבל לכונ ,'a' תואל הב ישילשה רביאה תא תונשלו ל"נה תזורחמל תשגל ידכ ,לשמל *(str + 2 * 1) = 'a'; str[2] = 'a'; // is another way ךרעמל רחא עיבצמ םע השיג .יטטס עיבצמ אוה ךרעמ םשש םושמ ךרעמל עיבצמה לש תבותכה ךרע תא תונשל לכונ אלש ונרמא לע עיבצהל לכוי רשא (ימניד) רחא עיבצמ רידגהל ךרטצנ ,(עיבצמ י"ע) ךרעמב אתל הרישי השיג םשל :ךכ תאז עצבל לכונ .ךרעמב רביא לכ char *p=str; תאז עצבל לכונ ,'a' תואה תא ישילשה ותב םישל הצרנ םא ,אמגודל . p - "םש דוע" ונשי str תזורחמלש :םיעיבצמה דחא םע השיג י"ע str[2] = 'a'; p[2] = 'a'; // does the same p-ל תתל לכונ ךא (יטטס עיבצמ אוה str-ש םושמ) תזורחמב ישילשה אתה לש תבותכה תא str-ל תתל לכונ אל :האבה הדוקפה י"ע ךרעמב ישילשה רביאה לע עיבצהל (עיבצמכ רדגומ רבכש) p=str+2; *p = 'a'; תוצירטמל םיעיבצמ ןיב רשקה .ומצע ינפב ךרעמ אוה הצירטמב רביא לכ ,רמולכ .םיכרעמ לש ךרעמ איה ,עודיכ ,הצירטמ :אמגוד int mat[5][10]; .הצירטמב [0,0]-ה רביאל עיבצמה ,עיבצמ לש םש אוה mat .(הדומעו הרוש) םיסקדניא 2 י"ע הצירטמב את לכל סחייתהל לכונ :אמגוד !םלש ךרעמל תוסחייתה איה דחא סקדניא תועצמאב הצירטמל תוסחייתה mat[2]; .תישילשה הרושב ןושארה רביאה תבותכ אוה mat[2] רמולכ ,ומצע ינפב עיבצמ אוה ךרעמ לש םש ירהו :ךכ םושרל לכונ int *p = mat[2]; :ךכ ל"נה הדוקפל הלוקשה הדוקפה תא םושרל םילוכי ונייה int *p = &mat[2][0]; :תועט איה האבה הדוקפה םושיר int *p = mat[2][0]; היצקנופל תבותכ לש הלבקו תחילש ריזחהל הלוכי היצקנופש ,איה היעבה .היצקנופ תועצמאב תישארה תינכותהמ םינתשמ המכ לע לועפל הצרנ םימעפל .םיעיבצמ תועצמאב היעבה לע רבגתהל לכונ .דבלב דחא ךרע רתויה לכל הליגר ךרדב תאז תושעל ןויסנ לכ .םכרע תא ףילחהל וננוצרבו (y-ו x) תישארה תינכותב םינתשמ 2 םימייקש חיננ לע םייונישה תא עצבתו ןורכיזב םיקתוע םהל חתפת םינתשמה ינש תא טולקתש היצקנופהש םושמ חילצי אל .תישארה תינכותה ינתשמב רבד םוש הרק אל ונתניחבמו ןורכיזהמ ונופי םיקתעהה ,היצקנופה םויסב .םיקתעהה void swap(int x, int y) { int temp=x; x=y; y=temp; } void main() { int x=4,y=3; swap(x,y); printf("x=%d y=%d",x,y); } ![]() אלל תישארה תינכותב םינתשמה תא ריאשיש המ ,היצקנופב ורדגוהש םינתשמה ןורכיזהמ ונופי ,היצקנופה םויסב .יוניש :ךכ היעבה לע רבגתהל לכונ .היצקנופב םמצע םינתשמה לע דובענו םהלש תבותכה תא חלשנ ,םינתשמה יכרע תא חולשל םוקמב :ךכ היצקנופל ארקנ .swap אוה םיכרעה תפלחה תיצקנופ לש המשש חיננ swap (&x, &y); :ךכ תאז רידגנ ןכל .םיכרע אלו תובותכ לבקת איהש ךכ היצקנופה תא רידגהל ךרטצנ ,תובותכ ונחלש םא void swap(int *px, int *py) האיגש איה םיליגר םינתשמ י"ע תובותכ תלבק .int סופיטמ םיעיבצמ ינש י"ע ןתוא לבקל ךרטצנ int - סופיטמ !תובותכ לבקל םילוכי אל םיליגר םינתשמש םושמ .תישארה תינכותהמ םינתשמה לע שממ םידבוע ונחנאש םושמ (void) ךרע םוש ריזחהל הכירצ אל היצקנופה :ךכ הארית היצקנופה void swap(int *px, int *py) { int temp = *px; *px = *py; *py = temp; } תבותכה תא לבקמ py עיבצמהו תישארה תינכותהמ x הנתשמה תבותכ תא לבקמ px עיבצמה ,ל"נה היצקנופב הרישי תוסחייתה איה םיעיבצמה םה םהילע תבותכה לש ךרעל תוסחייתה לכ .תישארה תינכותהמ y הנתשמה לש .תישארה תינכותמ y-ו x םינתשמל היצקנופל ךרעמ לש הלבקו החילש עיבצמ אוה ךרעמה םש) .ולש ןושארה רביאה לש תבותכ םע םיארוק םצעב ונא ,ךרעמ םע היצקנופל םיארוק ונאשכ .(וב ןושארה אתל .תינכותב arr םשב ךרעמ ונשיש חיננ :דימת ךכ עצבתת ךרעמה םע היצקנופל האירק func(arr); int arr[10], *p=arr; func(p); :םיכרד 2 ןנשי היצקנופה תרדגהל :(ךרעמה דבלמ תרחא תבותכל עיבצהל לוכי וניאש יטטס עיבצמ) ךרעמ םש תלבק ,תחאה void func(int arr[]); :וכרע תא תונשל לוכיה עיבצמ תלבק ,היינשה void func(int *arr); arr++; היצקנופל הצירטמ לש הלבקו החילש .הלש ןושארה רביאה תבותכ םע היצקנופל םיארוק םצעב ונא ,הצירטמ לש םש םע היצקנופל םיארוק ונאשכ .תינכותב mat םשב הצירטמ הנשיש חיננ :דימת ךכ עצבתת הצירטמה םע היצקנופל האירק func(mat); .(םיליגר םינתשמ לש אלו) םיכרעמ :תועט איה האבה הדוקפה ,רמולכ int *p = mat; :ךכ תאז השענ .(mat הצירטמה int mat[5][10], *p[5], i; for (i=0; i<5; i++) p[i] = mat[i]; .המאתהב mat הצירטמב הרוש לביק p םיעיבצמה ךרעמב עיבצמ לכ :לשמל .p םיעיבצמה ךרעמ תועצמאב הצירטמל סחייתהל רשפא ,וישכע p[3][4] = 3; mat[3][4] = 3; // both commands are the same הרהבה עיבצמ אוה p רמולכ) םיעיבצמ לש ךרעמ אוה p-ש םושמ p תועצמאב mat הצירטמב לפטתש היצקנופל אורקל לכונ אל .(ויתורוש לכל םיעיבצמה לכ תא ליכמ אל אוהו) םיכרעמ לש ךרעמ תליחתל עיבצמ mat-ש דועב (םיעיבצמל :םיכרד 2 ןנשי היצקנופה תרדגהל :(תרחא תבותכל עיבצהל לוכי וניאש םיכרעמ לש ךרעמל יטטס עיבצמ) הצירטמ םש תלבק ,תחאה void func(int mat[][10]); :וכרע תא תונשל לוכיה עיבצמ תלבק ,היינשה void func(int (*mat)[10]); int *mat[10]; int (*mat)[10]; :וזכ הדוקפ םושרל לכונ רמולכ .עיבצמה עיבצי הילע תבותכה תא תונשל תלוכיה איה היינשה הטישב ןורתיה mat++; םיעיבצמ לש ךרעמ .(ליגר רביא אלו) ומצע ינפב עיבצמ אוה וב רביא לכ רשא ,רבד לכל ךרעמ אוה םיעיבצמ לש ךרעמ הרוש לש תבותכב וב עיבצמ לכ לחתאל לכונ םיעיבצמ לש ךרעמ תועצמאבש וניאר ,הצירטמה לע אמגודב .הצירטמב תרחא :אבה ןפואב רידגנ םיעיבצמ לש ךרעמ int *arr[5]; arr ,רמולכ .םיעיבצמ לש ךרעמל עיבצמ איה arr הלימה ןכל ,וב ןושארה רביאל עיבצמ אוה ךרעמ לש םשש ונרמא .םיעיבצמה ךרעמב ןושארה עיבצמל עיבצמ אוה arr - !ליגר עיבצמ אל אוה :אבה רבדה תא עצבל לכונ אל ,ךרעמה לש הנושארה תבותכה תא (p אמגודל) רחא עיבצמל תתל הצרנ םא int *p=arr; :י"ע תאזו עיבצמל עיבצמ היהיש ,ךכ p תא רידגהל ךרטצנ ,ןכל int **p=arr; :(החנה ןה םינתשמה תובותכ לכ) ןורכיזב הרקמל אמגוד .המאתהב םהמ דחא לכ לע עיבצמ arr םיעיבצמה ךרעמ רשא a,b,c,d,e ןורכיזב םינתשמ 5 םנשיש חיננ .1000 תבותכב אצמנ p עיבצמל עיבצמה - .(םיתב 2 ספות וב עיבצמ לכ) 3000 תבותכב ליחתמ arr םיעיבצמה ךרעמ - .3 וכרעו 4000 תבותכב אצמנ a הנתשמה - .6 וכרעו 4200 תבותכב אצמנ b הנתשמה - .9 וכרעו 4400 תבותכב אצמנ c הנתשמה - .2 וכרעו 4500 תבותכב אצמנ d הנתשמה - .5 וכרעו 5000 תבותכב אצמנ e הנתשמה - :ךכ הארנ רבדה ,ןורכיזב ![]() :תואמגוד ![]() תוזורחמל םיעיבצמ ךרעמ תחא הצירטמב תוזורחמ רפסמ גוציי לש היעב הנשי .תזורחמ איה הב הרוש לכ רשא הצירטמ אוה תוזורחמ לש ךרעמ ךרטצנ ךא תוזורחמה ראשמ רתוי הברה לודג הכרואש הצירטמב תחא תזורחמ הנשיו ןכתיי .ןורכז זובזב איהו .וז תזורחמ ךרואל הצירטמה דמימ תא עובקל :אמגודל רידגהל ךרטצנ ךכ םשל .הצירטמל ןלוכ תא סינכהל וננוצרבו "abcdefghi", "mn", "xy" תוזורחמ 3 ןנשיש חיננ :ךכ הארתש 10x3 םיות תצירטמ ![]() .תוזורחמל םיעיבצמ ךרעמ י"ע תאזו ,תרחא הרוצב שורדה םינותנה הנבמ תא ןגראל לכונ : איה ךרדה char *arr_ptr[3] = {"abcdefghi", "mn", "xy"}; ![]() .1000 תבותכמ ליחתמ arr_ptr םיעיבצמה ךרעמ - .4000 תבותכמ הליחתמ "abcdefghi" תזורחמה - .3000 תבותכמ הליחתמ "mn" תזורחמה - .5000 תבותכמ הליחתמ "xy" תזורחמה - 3 -ל םיעיבצמ 3 ליכמ םיעיבצמה ךרעמ .הזל רבעמ אלו תקקזנ איה ול ןורכיזה אצקומ תזורחמ לכל ,וז ךרדב !והשלכ םש ןיא תוזורחמלש בל םישל שי .תוזורחמה תא םיליכמ רשא ןורכיזב םינוש תומוקמ .arr_ptr םיעיבצמה ךרעמב םיאתמה עיבצמל היינפ י"ע קר ןכתיי תזורחמל תוסחייתה לכ :ךכ הדוקפה תא םושרל ךרטצנ ,a ליגר הנתשמב ותוא םישלו "abcdefghi" תזורחמה ךרוא תא לבקל הצרנ םא :אמגודל a = strlen(arr_ptr[0]); .הכרוא תא לבקל ידכב strlen() |