שיעורי מודול (2/2)
מצביעים
מצביעים הם אחד המאפיינים החזקים והמיוחדים ביותר של C++. הם מאפשרים לך לגשת ישירות לזיכרון הפיזי של המחשב, מה שמאפשר ניהול יעיל של משאבים וביצועים גבוהים.
1. מהו זיכרון וכתובת?
כל משתנה שאתה מצהיר בתוכנית שלך מאוחסן בתא של זיכרון ה-RAM. לכל תא יש כתובת זיכרון ייחודית (בדרך כלל מתבטאת בפורמט הקסדצימלי, למשל, 0x7ffee3bf87ac).
C++ מאפשר לנו לקבל את כתובת הזיכרון של כל משתנה באמצעות האופרטור address-of &:
int x = 42;
std::cout << &x; // Prints the memory address of x (e.g., 0x7ffee3bf87ac)2. הגדרה של מצביע
מצביע הוא משתנה מיוחד שמאחסן את כתובת הזיכרון של משתנה אחר כערך שלו.
התחביר מחייב שימוש בכוכבית * אחרי סוג הנתונים:
int x = 42;
int* ptr = &x; // ptr is a pointer to an integer that contains the address of x3. מפעיל ההפניה (*)
כדי לגשת או לשנות את הערך המאוחסן בכתובת שאליה מצביע המצביע, אנו משתמשים באופרטור dereference (או אופרטור עקיפה), המיוצג גם על ידי הסמל *:
int x = 42;
int* ptr = &x;
std::cout << *ptr; // Prints 42 (the value ptr points to)
*ptr = 100; // Modifies the value of x through the pointer
std::cout << x; // Now prints 100!4. נקודות אפס: nullptr
יש לאתחל מצביע שאינו מצביע על כתובת חוקית כלשהי עם מילת המפתח nullptr (מוצגת ב-C++11):
int* ptr = nullptr; // Safe null pointerנסה זאת בעצמך
ב-main, יש ערך של משתנה שלם המאוחל ל-42. הכריז על מצביע למספר שלם ptr שמצביע על כתובת הערך. השתמש בהתייחסות של ptr כדי להגדיר את ערך הערך ל-100, ולבסוף הדפס ערך באמצעות std::cout.
הצג רמז
הכריז על המצביע עם `int* ptr = &value;`, שנה את הערך על ידי הסרת '*ptr = 100;`, והדפיס `std::cout << value;`.
הפתרון זמין לאחר 3 ניסיונות
הגדר פונקציה doubleValue שמקבלת מצביע למספר שלם (int* ptr) ומכפילה את הערך שאליו הוא מצביע ב-2 (אם המצביע אינו null). ב-main, קרא doubleValue העברת הכתובת של המשתנה num והדפיס אותו.
הצג רמז
הפונקציה חייבת לקבל 'int* ptr'. בפנים, השתמש ב-`*ptr = (_ptr) _ 2`. ב-main call זה עם `doubleValue(&num);`.
הפתרון זמין לאחר 3 ניסיונות
בהינתן הקוד שסופק, איזה ביטוי מאפשר לך לשנות ישירות את הערך של a, להגדיר אותו ל-10?
int a = 5;
int* p = &a;
// quale istruzione assegna 10 ad a?