03-06-2005, 18:53
|
|
|
חבר מתאריך: 12.04.05
הודעות: 40
|
|
אני ממליץ ללמוד מהאתר www.cplusplus.com ,זה גם לC וגם לC++.
וגם את האתר www.cppreference.com .זה גם לC ולC++.
טוב הנה אני יענה לך על השאלות.
תראה.
אם הפונקציה היא a, אז:
void a(char *b){}
a("aaa");
כאן אתה מכניס לb את הערך "aaa".
char *c="not.my.i.p";
a(c);
כאן אתה מכניס את הערך של c לתוך b שבפונקציה a.
כך שזה אותו הדבר.
רק כדי למנוע אי-הבנות, זה לא מדוייק שאתה מכניס את הערך של c כי "aaa" זה בעצם לא הערך שלו.
אתה מכניס את המיקום בזיכרון שאליו הוכנס "aaa" (בסיום יש '\0') ומאחר וb (של פונקציה a) גם יהיה לו את אותו מיקום, הוא ישתמש באותו מידע שהוכנס משם
אם הזיכרון הוא: [...aaa\0...]
אז במיקום שאיפה מתחיל הa הראשון זה מה שמכניסים לb ואם נדפיס את b הוא ידפיס מאותו a ועד ל0\ (לא כולל).
למה תרצה להכניס char (בהנחה שאתה מתכוון לתו יחיד)?
זה יהיה בעייתי כי זה צריך להיות מחרוזת כדי שיסתיים ב0\ (אלא אם כן התו הוא 0\ ואז לא יהיה לזה טעם).
אבל בכל מקרה, אפשר ככה:
char d='5';
a(&d);
בצירוף של & אני שולח לפונקציה a את המיקום של משתנה d. כמו:
char *d="";
d[0]='5';
a(d);
שמתי לd "" כדי שיאחסן מקום רק ל0\ ואז אחליף אותו ב'5' (זה רק כדי להמחשה. אל תיקח את זה בתור הרגל ובתור בכלל. שתי שגיאות:
1) מחרוזת חייבת להסתיים ב0\. בהמשך אסביר למה. זה גם מתייחס לדוגמא הראשונה שנתתי עם הסימן &.
2) זה לא רעיון טוב לאחסן ככה זיכרון, זה היה רק כדי לקצר את ההודעה. במיוחד אם תרצה לאחסן הרבה תאים.)
ובהמשך להודעה. אז אם נדפיס את זה דרך פונקציה מוכנה אז זה תלוי בפונקציה מתי המחשב יפסיק להדפיס תווים לאחר תו '5'.
הסיבה: הפונקציה המוכנה (כמו printf) מחכה שתמצא 0\ ואז תפסיק את הלולאה שבה היא מדפיסה את התווים.
אז או שהיא תמצא 0\ של מחרוזת אחרת או שהיא תגלה איכשהוא שזה מחוץ למחרוזת. (סביר להניח שהיא תגלה איכשהוא אבל קצת מאוחר, אולי יש כל מיני 0\ בזיכרון כשהמחשב נפתח והם משתנים כשמאחסנים זיכרון במקומות שלהם? לא יודע.)
וואני לא רואה הבדל בין שתי השורות (בקשר לשאלות ששאלת)
רק תזכיר לי לא להמליץ על הספר הזה.
מקווה שעזרתי (ושהבנת),
אמיר.
נערך לאחרונה ע"י pex22 בתאריך 03-06-2005 בשעה 18:59.
|