שמות מערכים כמצביעים
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-C של Coddy. שיעור 7 מתוך 63.
למערכים ולמצביעים ב-C יש קשר מיוחד, שהוא יסודי להבנת האופן שבו C פועלת עם נתונים בזיכרון. כשמכריזים על מערך, שם המערך עצמו משמש כמצביע קבוע לאיבר הראשון במערך.
המשמעות היא שכאשר יש לך מערך כמו int numbers[5];, השם numbers הוא למעשה מצביע שתמיד מצביע אל numbers[0]. אפשר לחשוב על שם המערך כעל מצביע מובנה שאין צורך להצהיר עליו בנפרד.
int numbers[5] = {10, 20, 30, 40, 50};
// 'numbers' מצביע על האיבר הראשון
// numbers == &numbers[0] // אלה שקולים!השקילות הזו חיונית: numbers ו־&numbers[0] נותנים לך את אותה כתובת זיכרון בדיוק. שם המערך הוא פשוט דרך נוחה יותר להתייחס לכתובת של האיבר הראשון, בלי להשתמש באופרטור לקיחת הכתובת.
הבנת הקשר הזה פותחת את הדלת לשימוש בטכניקות של מצביעים עם מערכים, דבר שיכול להפוך את הקוד שלך לגמיש ויעיל יותר. ההבדל העיקרי הוא שבניגוד למצביעים רגילים, שמות מערכים הם מצביעים קבועים — אי אפשר לשנות למה הם מצביעים.
אתגר
קלכתבו תוכנית C שמדגימה את השקילות בין שמות מערכים לבין מצביעים לאיבר הראשון שלהם. התוכנית שלכם צריכה:
- להצהיר על מערך מספרים שלמים בשם
numbersובו 4 איברים, ולאתחל אותו בערכים {10, 20, 30, 40} - להצהיר על מצביע למספר שלם בשם
ptr - להש assign את שם המערך
numbersלמצביעptr - להדפיס את הכתובת המאוחסנת ב-
numbersבאמצעותprintfעם מציין הפורמט%p - להדפיס את הכתובת של האיבר הראשון
&numbers[0]באמצעותprintfעם מציין הפורמט%p - להדפיס את הכתובת המאוחסנת ב-
ptrבאמצעותprintfעם מציין הפורמט%p - להדפיס את הערך של האיבר הראשון באמצעות שם המערך:
*numbers - להדפיס את הערך של האיבר הראשון באמצעות המצביע:
*ptr
הפלט שלכם צריך להציג את התוצאות בפורמט הבא:
Array name address: [address]
First element address: [address]
Pointer address: [address]
Value via array name: 10
Value via pointer: 10האתגר הזה מדגים ששם המערך מתפקד כמצביע קבוע לאיבר הראשון, וש-numbers, &numbers[0] ו-ptr מכילים כולם את אותה כתובת זיכרון כאשר ptr מקבל את שם המערך.
נסו בעצמכם
#include <stdio.h>
int main() {
// TODO: כתבו כאן את הקוד שלכם
// 1. הכריזו על המערך 'numbers' ואתחלו אותו עם {10, 20, 30, 40}
// 2. הכריזו על מצביע למספר שלם בשם 'ptr'
// 3. הציבו במצביע את שם המערך
// 4. הדפיסו את כל הכתובות והערכים הנדרשים
return 0;
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1יסודות המצביעים
מהו מצביע?הכרזה על מצביעיםאופרטור לקיחת הכתובת (&)אופרטור ביטול ההפניה (*)מצביעי NULLסיכום: יסודות המצביעים2מצביעים ומערכים
שמות מערכים כמצביעיםאיברי מערך ומצביעיםאריתמטיקה של מצביעיםהשוואת מצביעיםסיכום: מעבר על מערך באמצעות מצביעים5מצביעים ופונקציות
העברה לפי ערךהעברת מצביעים לפונקציותשינוי משתנים באמצעות מצביעיםדוגמה קלאסית: החלפההעברת מערכים לפונקציותחזרה: ארגומנטים של מצביעי פונקציה3מערכי תווים ומחרוזות
מחרוזות כמערכי charתו הסיום nullקלט מחרוזת באמצעות scanfשימוש ב־strlen()שימוש ב־strcpy()שימוש ב־strcat()שימוש ב־strcmp()סיכום: פונקציות מחרוזת בסיסיותתרגלו בעצמכם: קומפיילר C אונליין