למרות שמצביעים אינם חשובים באותה מידה דלפי כמו שהם ב- C או C ++, הם כלי "בסיסי" כזה שכמעט כל מה שקשור אליו תכנות חייבים להתמודד עם עצות בצורה מסוימת.
מסיבה זו אתה עשוי לקרוא על האופן בו מחרוזת או אובייקט הם באמת רק מצביע, או שמטפל באירועים כמו OnClick הוא למעשה מצביע להליך.
מצביע לסוג נתונים
במילים פשוטות, מצביע הוא משתנה המחזיק את הכתובת של כל דבר בזיכרון.
כדי לקבוע הגדרה זו, זכור כי כל מה שמשמש יישום מאוחסן איפשהו בזיכרון של המחשב. מכיוון שמצביע מחזיק את הכתובת של משתנה אחר, אומרים שהוא מצביע על אותו משתנה.
רוב הזמן מצביעים בדלפי על סוג מסוים:
var
iValue, j: מספר שלם; pIntValue: ^ מספר שלם;
התחלiValue: = 2001; pIntValue: = @iValue;... j: = pIntValue ^;
סוף;
ה תחביר להכריז כי סוג נתוני המצביע משתמש ב- caret (^). בקוד שלעיל iValue הוא משתנה מסוג מספר שלם ו- pIntValue הוא מצביע מסוג מספר שלם. מכיוון שמצביע אינו אלא כתובת בזיכרון, עלינו להקצות לו את המיקום (הכתובת) של הערך המאוחסן במשתנה שלם iValue.
ה @ מפעיל מחזירה את הכתובת של משתנה (או פונקציה או הליך כפי שנראה בהמשך). שווה למפעיל @ הוא פונקציית Addr. שים לב שערך pIntValue אינו 2001.
בקוד דוגמה זה, pIntValue הוא מצביע שלם מוקלד. סגנון תכנות טוב הוא להשתמש במצבעות שהוקלדו ככל שתוכלו. סוג הנתונים של המצביע הוא סוג מצביע כללי. זה מייצג מצביע לכל נתונים.
שים לב שכאשר "^" מופיע אחרי משתנה מצביע, הוא מפנה את המצביע; כלומר, הוא מחזיר את הערך המאוחסן בכתובת הזיכרון שבידי המצביע. בדוגמה זו, למשתנה j יש אותו ערך כמו iValue. נראה כי אין לכך מטרה כאשר אנו יכולים פשוט להקצות את iValue ל- j, אך פיסת הקוד הזו מסתתרת מאחורי רוב השיחות ל- Win API.
NILing מצביעים
עצות שלא הוקצו הן מסוכנות. מכיוון שמצביעים מאפשרים לנו לעבוד ישירות עם זיכרון המחשב, אם ננסה (בטעות) לכתוב למיקום מוגן בזיכרון, אנו עלולים לקבל שגיאת הפרת גישה. זו הסיבה שעלינו לאתחל תמיד מצביע ל- NIL.
NIL הוא קבוע מיוחד שניתן להקצות לכל מצביע. כשמשויכים לאפס למצביע, המצביע לא מתייחס לשום דבר. דלפי מציגה, למשל, ריק מערך דינמי או מחרוזת ארוכה כמצביע אפס.
מצביעי אופי
הסוגים הבסיסיים PAnsiChar ו- PWideChar מייצגים הצבעות לערכי AnsiChar ו- WideChar. ה- PChar הגנרי מייצג מצביע למשתנה Char.
מצביעי תווים אלה משמשים לתמרון שהסתיים בביטול מיתרים. חשוב על PChar כמצביע למיתר עם סיום בטל או למערך המייצג אחד.
מצביעים לרשומות
כשאנחנו מגדירים רשומה או סוג נתונים אחר, זהו נוהג נפוץ גם להגדיר מצביע לסוג זה. זה מקל על מניפולציות על מקרים מהסוג מבלי להעתיק גושי זיכרון גדולים.
היכולת להצביע על רשומות (ומערכים) מקלה בהרבה על הגדרת מבני נתונים מורכבים כרשימות ועצים מקושרים.
סוג
pNextItem = ^ TLinkedListItem
TLinkedListItem = תקליטsName: מחרוזת; iValue: מספר שלם; NextItem: pNextItem;
סוף;
הרעיון שמאחורי רשימות מקושרות הוא לתת לנו את האפשרות לאחסן את הכתובת לפריט המקושר הבא ברשימה בתוך שיא רשומות NextItem.
ניתן להשתמש גם במצבעות לרשומות בעת אחסון נתונים מותאמים אישית עבור כל פריט בתצוגת עץ, למשל.
עצות פרוצדורליות ושיטות
מושג מצביע חשוב נוסף בדלפי הוא מצביעי פרוצדורות ושיטות.
מצביעים המפנים לכתובת של נוהל או פונקציה נקראים מצביעים פרוצדורליים. מצביעי שיטה דומים למצביעי נוהל. עם זאת, במקום להצביע על נהלים עצמאיים, עליהם להצביע על שיטות הכיתה.
מצביע שיטה הוא מצביע שמכיל מידע על השם והאובייקט שאותו מופעל.
מצביעים ו- Windows API
השימוש הנפוץ ביותר עבור מצביעים בדלפי הוא ממשק לקוד C ו- C ++, הכולל גישה לממשק ה- API של Windows.
חלונות פונקציות API משתמשות במספר סוגי נתונים שעלולים להיות לא מוכרים עבור מתכנת הדלפי. מרבית הפרמטרים בפונקציות API קוראים הם עצות לסוג נתונים מסוים. כאמור לעיל, אנו משתמשים במחרוזות שהסתיימו בביטול בדלפי כאשר אנו קוראים לפונקציות API של Windows.
במקרים רבים, כאשר שיחת API מחזירה ערך במאגר או מצביע למבנה נתונים, חייבים להקצות מאגרים ומבני נתונים אלה על ידי היישום לפני ביצוע שיחת ה- API. פונקציית ה- API של SHBrowseForFolder Windows היא דוגמה אחת.
הקצאת מצביע וזיכרון
הכוח האמיתי של מצביעים נובע מהיכולת להפריש זיכרון בזמן שהתוכנית מבצעת.
פיסת קוד זו אמורה להספיק כדי להוכיח שעבודה עם מצביעים אינה קשה ככל שתראה בהתחלה. זה משמש כדי לשנות את הטקסט (הכיתוב) של הפקד באמצעות הידית המסופקת.
תהליך GetTextFromHandle (hWND: THandle);
var pText: PChar; // מצביע לטבלה (ראה למעלה)TextLen: מספר שלם;
התחל
{קבל את אורך הטקסט}TextLen: = GetWindowTextLength (hWND);
{להקצות זיכרון}
GetMem (pText, TextLen); // לוקח מצביע
{קבל את טקסט השליטה}GetWindowText (hWND, pText, TextLen + 1);
{הצג את הטקסט}ShowMessage (מחרוזת (pText))
{שחרר את הזיכרון}FreeMem (pText);
סוף;