נשלח בתאריך: 11 August 2006 בשעה 14:10 | | IP רשוּם
|
|
|
|
יוני כתב:
אם אני משנה את אחד הפרמטרים שהפונקציה שלי מקבלת (בשפת
C) ואני רוצה שהשינוי הזה ישמר ויהיה גם בפונקציה הקוראת במשתנה
המקורי איך אני עושה את זה (חוץ ממערכים שאני יודע שאם מעבירים אותם
כפרמטרים אז אם משנים אותם בפונקציה אז גם המערך המקורי משתנה בכל מקרה גם
בלי לעשות משהו מיוחד)? |
|
|
הפונקציה צריכה לקבל מצביע למשתנה, במקום את הערך שלו. לדוגמה:
קוד:
#include <stdio.h>
void f(int* pi)
{
*pi = *pi + 3;
}
int main(void)
{
int i;
int* pi;
pi = &i;
i=5;
printf("%d\n", i);
f(pi);
printf("%d\n", i);
return 0;
} |
|
|
המשתנה pi הוא מצביע ל-int. זו משמעות הכוכבית בהצהרה עליו. אנחנו
קובעים שהמצביע pi יצביע למשתנה i בעזרת האמפרסנד, שהוא אופרטור שמספק
כתובת של משתנה.
הפונקציה f מקבלת מצביע ל-int, ולא סתם int (שוב, בגלל הכוכבית), ואליה
אנחנו מעבירים את pi ולא את i. כדי לגשת לערך שאליו מצביע pi, במקום לשנות
את הכתובת (כמו שעשינו בתוך main) שוב משתמשים בכוכבית. *p נותן גישה
לערך שאליו p מצביע, כש-p הוא מצביע בעצמו.
עכשיו כשאנחנו מבינים מה כל העסק, אפשר לכתוב את main קצת יותר בקיצור:
קוד:
#include <stdio.h>
void f(int* pi)
{
*pi = *pi + 3;
}
int main(void)
{
int i;
i=5;
printf("%d\n", i);
f(&i);
printf("%d\n", i);
return 0;
} |
|
|
כאן אנחנו מעבירים ל-f ישר את הכתובת, במקום ליצור משתנה נפרד.
יוני כתב:
ופונקציה ב-C יכולה להחזיר ערכים מכל הסוגים של
הטיפוסים כולל סוגים שאני כותב בtypedef וכולל מערכים, מבנים, רשימות
מקושרות... או שפונקציה יכולה להחזיר ערכים רק מסוגים מסויימים של טיפוסי
נתונים? |
|
|
פונקציה יכולה להחזיר פחות או יותר הכל, ושימוש ב-typdef-ים מומלץ מאוד, כדי לא להיתקל בבעיות מוזרות (מה שלא כל כך נדיר ב-C).
|