Δημοσιεύτηκε: 03 Ιούλ 2011, 10:36
Star_Light έγραψε:ΑΚΟΥΝΑ ΜΑΤΑΤΑ! Δεν τον καλεις.... με την διευθυνση του.... επομενως δεν ειναι call by reference σωστα ????
Ουσιαστικα εφοσον δεν τον καλεις μεσα στην συναρτηση με ορισμα την διευθυνση του... οπως τον καλουσες και στο αλλο τουτοριαλ δηλαδη foo(&n) τοτε ΔΕΝ ειναι by reference ε??? αλλα by value και το κανεις αυτο για να μην "χαλασεις" τον δεικτη που ουσιαστικα βρισκεται εξω απο την main και θελεις να δειχνει στην αρχη της λιστας σου ? !
Eιναι ισως και αυτο που ειχες πει οτι ακομη και αν βαλω αστερισκο μεσα στην συναρτηση στο ορισμα δεν σημαινει πως περναω με αναφορα.....
αν δεν καλεσω την συναρτηση με την διευθυνση της μεταβλητης ειτε ειναι δεικτης ειτε απλη μεταβλητη??? γιατι και ο δεικτης επι της ουσιας μεταβλητη ειναι τι ειναι..... δεν κανουν τα ρασα τον παππα που λεμε! Αλλα ο παππας τα ρασα...!!!
Αυτό ακριβώς
Για να περάσεις μια μεταβλητή σε μια συνάρτηση by reference πρέπει ΚΑΙ στην main() να περάσεις ως όρισμα τη συνάρτησης τη διεύθυνση μνήμης της μεταβλητής (δηλαδή με & μπροστά από το όνομά της) ΚΑΙ μέσα στη συνάρτηση να την διαχειρίζεσαι ως δείκτη
Η λογική παραμένει η ίδια, είτε η αυθεντική μεταβλητή σου είναι μια απλή μεταβλητή, είτε είναι δείκτης, είτε είναι δείκτης σε δείκτη!
Δηλαδή, αν η αρχική σου μεταβλητή είναι δηλωμένη ως μια απλή μεταβλητή n στην main, τότε την περνάς στην συνάρτηση ως &n και μέσα στη συνάρτηση την διαχειρίζεσαι ως *n.
Αν η αρχική σου μεταβλητή είναι δηλωμένη ως δείκτης *n στην main, τότε την περνάς στην συνάρτηση πάλι ως &n και μέσα στη συνάρτηση την διαχειρίζεσαι ως **n (διπλός δείκτης).
Αν η αρχική σου μεταβλητή είναι δηλωμένη ως δείκτης σε δείκτη **n στην main, τότε την περνάς στην συνάρτηση πάλι ως &n και μέσα στη συνάρτηση την διαχειρίζεσαι ως ***n (τριπλός δείκτης).
Και πάει λέγοντας...
Ορίστε κι άλλο ένα μικρό παράδειγμα (δες πως συμπεριφέρεται ο px)...
- Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <stdlib.h>
// ------------------------------------------------------------------------------
void px_by_value (int *px, int *py )
{
px = py;
return;
}
// ------------------------------------------------------------------------------
void px_by_ref (int **px, int *py )
{
*px = py;
return;
}
// ------------------------------------------------------------------------------
int main( void )
{
int x = 10, y = 20;
int *px = &x, *py = &y;
printf("\nstart:\t\t*px=%d, *py=%d\n", *px, *py);
px_by_value( px, py );
printf("\nafter by_value:\t*px=%d, *py=%d\n", *px, *py);
px_by_ref( &px, py );
printf("\nafter by_ref:\t*px=%d, *py=%d\n", *px, *py);
fflush(stdin); getchar();
exit(EXIT_SUCCESS);
}