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

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

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

#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.

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

Αρχική τιμή του αριθμού: 10
Τελική τιμή του αριθμού: 11

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

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

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

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

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

int number = 42;

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

int* ptr = &number;

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

std::cout << "Η τιμή της μεταβλητής number: " << *ptr << std::endl;

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

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

#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 !!
Μετάβαση σε γραμμή εργαλείων