Customize Consent Preferences

We use cookies to help you navigate efficiently and perform certain functions. You will find detailed information about all cookies under each consent category below.

The cookies that are categorized as "Necessary" are stored on your browser as they are essential for enabling the basic functionalities of the site. ... 

Always Active

Necessary cookies are required to enable the basic features of this site, such as providing secure log-in or adjusting your consent preferences. These cookies do not store any personally identifiable data.

No cookies to display.

Functional cookies help perform certain functionalities like sharing the content of the website on social media platforms, collecting feedback, and other third-party features.

No cookies to display.

Analytical cookies are used to understand how visitors interact with the website. These cookies help provide information on metrics such as the number of visitors, bounce rate, traffic source, etc.

No cookies to display.

Performance cookies are used to understand and analyze the key performance indexes of the website which helps in delivering a better user experience for the visitors.

No cookies to display.

Advertisement cookies are used to provide visitors with customized advertisements based on the pages you visited previously and to analyze the effectiveness of the ad campaigns.

No cookies to display.

4.3 Οι αναφορές (references) στην γλώσσα C++

Οι αναφορές (references) στη γλώσσα C++ είναι ένα χρήσιμο χαρακτηριστικό που επιτρέπει τη δημιουργία εναλλακτικών ονομάτων (aliases) για υπάρχουσες μεταβλητές ή αντικείμενα. Ουσιαστικά, οι αναφορές είναι απλά επισημάνσεις που δίνονται σε υπάρχοντα αντικείμενα, και δεν αποτελούν αυτόνομες οντότητες όπως οι δείκτες.

Ας δούμε ένα αναλυτικό παράδειγμα χρήσης αναφορών στην C++:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#include <iostream>
// Συνάρτηση που αυξάνει την τιμή του αριθμού κατά 1
void increment(int& num) {
num++; // Αυξάνει την τιμή του αριθμού κατά 1
}
int main() {
int number = 10;
std::cout << "Αρχική τιμή του αριθμού: " << number << std::endl;
increment(number); // Καλείται η συνάρτηση increment με αναφορά στον αριθμό
std::cout << "Τελική τιμή του αριθμού: " << number << std::endl;
return 0;
}
#include <iostream> // Συνάρτηση που αυξάνει την τιμή του αριθμού κατά 1 void increment(int& num) { num++; // Αυξάνει την τιμή του αριθμού κατά 1 } int main() { int number = 10; std::cout << "Αρχική τιμή του αριθμού: " << number << std::endl; increment(number); // Καλείται η συνάρτηση increment με αναφορά στον αριθμό std::cout << "Τελική τιμή του αριθμού: " << number << std::endl; return 0; }
#include <iostream>

// Συνάρτηση που αυξάνει την τιμή του αριθμού κατά 1
void increment(int& num) {
    num++;  // Αυξάνει την τιμή του αριθμού κατά 1
}

int main() {
    int number = 10;
    std::cout << "Αρχική τιμή του αριθμού: " << number << std::endl;

    increment(number);  // Καλείται η συνάρτηση increment με αναφορά στον αριθμό

    std::cout << "Τελική τιμή του αριθμού: " << number << std::endl;

    return 0;
}

Σε αυτό το παράδειγμα, δημιουργούμε μια συνάρτηση με όνομα increment, η οποία παίρνει μια αναφορά σε έναν ακέραιο αριθμό. Μέσα στη συνάρτηση, αυξάνουμε την τιμή του αριθμού κατά 1 χρησιμοποιώντας τον τελεστή ++.

Στην main, δημιουργούμε μια μεταβλητή με όνομα number και αρχικοποιούμε την τιμή της σε 10. Έπειτα, καλούμε τη συνάρτηση increment με αναφορά στη μεταβλητή number. Αυτό σημαίνει ότι η συνάρτηση θα λειτουργήσει πάνω στην ίδια τη μεταβλητή number, αντί να αντιγράψει την τιμή της.

Στη συνέχεια, εκτυπώνουμε την τελική τιμή της μεταβλητής number, η οποία θα έχει αυξηθεί κατά 1 μετά την κλήση της συνάρτησης increment.

Το αποτέλεσμα που αναμένουμε είναι:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
Αρχική τιμή του αριθμού: 10
Τελική τιμή του αριθμού: 11
Αρχική τιμή του αριθμού: 10 Τελική τιμή του αριθμού: 11
Αρχική τιμή του αριθμού: 10
Τελική τιμή του αριθμού: 11

Αυτό συμβαίνει επειδή η αναφορά που περνάμε στη συνάρτηση increment επιτρέπει την αλλαγή της τιμής της μεταβλητής number απευθείας.

Οι διευθύνσεις μνήμης αντιπροσωπεύουν τις θέσεις όπου αποθηκεύονται οι μεταβλητές σε έναν υπολογιστή. Στη γλώσσα C++, μπορούμε να ανακτήσουμε τη διεύθυνση μνήμης μιας μεταβλητής χρησιμοποιώντας τον τελεστή &.

Όταν μια μεταβλητή δημιουργείται, της αντιστοιχεί μια μοναδική διεύθυνση μνήμης. Κατά την ανάθεση τιμής σε αυτήν τη μεταβλητή, η τιμή αποθηκεύεται στη διεύθυνση μνήμης που της αντιστοιχεί.

Για να ανακτήσουμε τη διεύθυνση μνήμης μιας μεταβλητής, χρησιμοποιούμε τον τελεστή & και το αποτέλεσμα είναι η διεύθυνση μνήμης όπου η μεταβλητή αποθηκεύεται. Με αυτόν τον τρόπο, μπορούμε να αναφερθούμε στη μεταβλητή απευθείας μέσω της διεύθυνσης μνήμης της.

Ας υποθέσουμε ότι έχουμε την ακόλουθη μεταβλητή στη γλώσσα C++:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
int number = 42;
int number = 42;
int number = 42;

Για να ανακτήσουμε τη διεύθυνση μνήμης της μεταβλητής “number”, μπορούμε να χρησιμοποιήσουμε τον τελεστή “&” ως εξής:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
int* ptr = &number;
int* ptr = &number;
int* ptr = &number;

Η μεταβλητή “ptr” είναι ένας δείκτης που δείχνει στη διεύθυνση μνήμης της μεταβλητής “number”. Μπορούμε να αναφερθούμε στην τιμή της μεταβλητής “number” απευθείας χρησιμοποιώντας τον δείκτη “ptr”:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
std::cout << "Η τιμή της μεταβλητής number: " << *ptr << std::endl;
std::cout << "Η τιμή της μεταβλητής number: " << *ptr << std::endl;
std::cout << "Η τιμή της μεταβλητής number: " << *ptr << std::endl;

Στο παραπάνω παράδειγμα, ο τελεστής “*” χρησιμοποιείται για να αναφερθούμε στην τιμή που αποθηκεύεται στη διεύθυνση μνήμης που δείχνει ο δείκτης “ptr”.

Μπορείτε επίσης να δημιουργήσετε αναφορά σε μια μεταβλητή που δεν έχει αρχικοποιηθεί ακόμη:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#include <iostream>
using namespace std;
int main() {
int myNum; // Δήλωση μιας μεταβλητής ακέραιου τύπου με όνομα myNum
int *myPointer = &myNum; // Δήλωση ενός δείκτη ακεραίου τύπου που δείχνει στη μεταβλητή myNum
cout << &myNum << endl; // Εκτύπωση της διεύθυνσης μνήμης της μεταβλητής myNum
cout << myPointer << endl; // Εκτύπωση της τιμής του δείκτη myPointer
return 0;
}
#include <iostream> using namespace std; int main() { int myNum; // Δήλωση μιας μεταβλητής ακέραιου τύπου με όνομα myNum int *myPointer = &myNum; // Δήλωση ενός δείκτη ακεραίου τύπου που δείχνει στη μεταβλητή myNum cout << &myNum << endl; // Εκτύπωση της διεύθυνσης μνήμης της μεταβλητής myNum cout << myPointer << endl; // Εκτύπωση της τιμής του δείκτη myPointer return 0; }
#include <iostream>
using namespace std;

int main() {
  int myNum; // Δήλωση μιας μεταβλητής ακέραιου τύπου με όνομα myNum
  int *myPointer = &myNum; // Δήλωση ενός δείκτη ακεραίου τύπου που δείχνει στη μεταβλητή myNum

  cout << &myNum << endl; // Εκτύπωση της διεύθυνσης μνήμης της μεταβλητής myNum
  cout << myPointer << endl; // Εκτύπωση της τιμής του δείκτη myPointer

  return 0;
}

Ο παραπάνω κώδικας δημιουργεί μια μεταβλητή myNum τύπου int και έναν δείκτη myPointer τύπου int *. Στη συνέχεια, εκτυπώνει τη διεύθυνση μνήμης της μεταβλητής myNum και την τιμή του δείκτη myPointer.

Οι εντολές cout << &myNum << endl; και cout << myPointer << endl; χρησιμοποιούν το αντικείμενο cout για να εκτυπώσουν τις τιμές. Η &myNum επιστρέφει τη διεύθυνση μνήμης της μεταβλητής myNum, ενώ η myPointer εκτυπώνει την τιμή του δείκτη myPointer.

Όταν ο κώδικας εκτελεστεί, θα εμφανιστούν οι διευθύνσεις μνήμης της μεταβλητής myNum και η τιμή του δείκτη myPointer στην οθόνη.

26 Ιουνίου, 2023
top
error: Content is protected !!
Μετάβαση σε γραμμή εργαλείων