Προς το περιεχόμενο

Εισαγωγη κομβου σε λιστα μεσω συναρτησης C


nickname2016

Προτεινόμενες αναρτήσεις

2) Μηπως ηθελες να πεις:

 

"πάρε την διευθυνση της μεταβλητής και χρησιμοποίησε την ως μεταβλητη και διάβασε τι υπάρχει εκεί". ?

Μπορείς να το πεις και έτσι. Μην ξεχνάς ότι η μεταβλητή υπάρχει για την δική σου ευκολία. Όταν μεταφραστεί αυτό που έγραψες παύει να υπάρχει το "int i" και υπάρχει η διεύθυνση τάδε.

 

3) Αφου καναμε type casting, λογικο δεν ειναι να εμφανιζει το σωστο αποτελεσμα?

Το type casting το έβαλα για να μην βαρέσει σφάλμα ο compiler επειδή δεν έχω δείκτη. Η διαδικασία όμως δεν εξαρτάται από το casting. Όπως ανέφερα, οι παλιοί compilers δεν ήταν τόσο σωστοί και σε άφηναν να το γράψεις χωρίς το casting. Εγώ αυτό που ήθελα να δείξω (ίσως να μην το κατάφερα) είναι ότι η φράση "δείκτης" υπάρχει στο μυαλό μας για να μας βοηθήσει στην κατανόηση. Είναι μια απλή μεταβλητή που έχει μια τιμή και αυτήν την τιμή εμείς επιλέγουμε να την χρησιμοποιήσουμε ως διεύθυνση.

 

Σωστα μπορουμε να πουμε οτι και το γνωστο "by reference" που λεμε και περναμε δεικτη.. στην ουσια περναμε την τιμη μιας μεταβλητης, by value. Απλα γινεται αυτη η, αν θελετε, εξουσιοδοτηση μεσω της οποιας μπορουμε να παρεμβουμε στα δεδομενα μια απλης μεταβλητης δια μεσου μιας αλλης μεταβλητης(δεικτη) κι αυτο οι οδηγοι το λενε By reference.

 

Αν αυτην την εξουσιοδοτηση, οι οδηγοι, οι καθηγητες, ολο το ιντερνετ την λεει by reference, τοτε πως γινεται η C να μην εχει by reference?

Τι πραγματικα σημαινει το by reference τοτε? Ποια γλωσσα υποστηριζει by reference?

Δες τους παρακάτω κώδικες:

% cat pointer.c 
#include <stdio.h>

void f(int *p)
{
	printf("p in f    has address %p, points to %p and *p has value %d\n", (void *)&p, (void *)p, *p);
}

int main(void)
{
	int i = 31;
	int *p = &i;
	printf("p in main has address %p, points to %p and *p has value %d\n", (void *)&p, (void *)p, *p);
	f(p);
	return 0;
}
% cc -m32 -o pointer pointer.c 
% ./pointer 
p in main has address 0x13c78, points to 0x13c7c and *p has value 31
p in f    has address 0x13c60, points to 0x13c7c and *p has value 31
Όπως βλέπεις, το p μέσα στην f δεν είναι "reference" στο p της main ή στο i αλλά έχουμε δύο ξεχωριστά p αντικείμενα. Δεσμεύθηκε τόση μνήμη όση χρειάζεται για ένα δείκτη (η οποία έτυχε να είναι η 0x13c60) και εκεί αντιγράφηκε ως τιμή η τιμή του p (δηλαδή η διεύθυνση του i). Όταν εμείς χρησιμοποιούμε τον τελεστή indirection *, τότε και στις δύο περιπτώσεις προσπελαύνουμε την διεύθυνση 0x13c7c και έτσι πειράζουμε το i αλλά δεν είναι πραγματικό reference.

 

Επειδή καταλήγουμε να πειράζουμε την τιμή του i, δηλαδή το αποτέλεσμα πλησιάζει το νόημα του "by reference", καταχρηστικά το ονομάζουμε "by reference".

 

Δες τώρα το ίδιο και σε C++. Σημειωτέον ότι θυμάμαι τα απολύτως βασικά από C++ οπότε πιθανώς το παράδειγμά μου να μην είναι δόκιμο (δεν είναι καν c++ κώδικας, απλά άλλαξα τα απολύτως απαραίτητα για να έχω references και το έκανα compile με τον g++)

 

% cat ref.cc 
#include <stdio.h>

void f(int &p)
{
	printf("p in f    has address %p and value %d\n", (void *)&p, p);
}

int main(void)
{
	int i = 31;
	int &p = i;
	printf("p in main has address %p and value %d\n", (void *)&p, p);
	f(p);
	return 0;
}
% g++ -m32 -o ref ref.cc 
% ./ref 
p in main has address 0xc5598 and value 31
p in f    has address 0xc5598 and value 31
Εδώ μιλάμε για ακριβώς το ίδιο πράγμα και όχι δύο διαφορετικά p. Όταν χρησιμοποιούμε reference, δεν χρειαζόμαστε τον τελεστή * αλλά χρησιμοποιούμε κατευθείαν το i. Μια reference δεν μπορεί να δηλωθεί ως "int &ref;" χωρίς να δείχνει κάπου ούτε μπορούμε να χρησιμοποιήσουμε αριθμητική και πχ να γράψουμε "ref++;" ώστε να την αλλάξουμε.

 

(Εσωτερικά το πιο πιθανό είναι ο compiler να το υλοποιεί και πάλι με δείκτες και να παράγει ακριβώς την ίδια assembly με την C έκδοση αλλά στην παρούσα φάση δεν μας αφορά εμάς).

 

Ελπίζω αφενός να μην είπα ανακρίβειες και αφετέρου να σου έδωσα να καταλάβεις. Εναλλακτικά περίμενε απάντηση από κάποιον που γνωρίζει C++ όπως οι Kercyn, παπί, κτλ.

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Απαντ. 89
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Αν μπορέσεις  Groot, να καλέσεις μια διαδικασία Α, όπως θέλεις πες το, και να περάσεις κάτι, θα μας πεις τι όμως, και σε αυτή την Α θα μπορέσεις να κάνεις πέντε κλήσεις σε αυτή που κάλεσε την Α  (δεν το γνωρίζει ο κώδικας πριν τρέξει) και να περάσεις πίσω μεταβλητές με αναφορά πρν επιστρέψει η Α στη αρχική θα σε παραδεχτώ! (αν το δεις με τη Μ2000 θα τρίβεις τα μάτια σου) (πρόσκληση για άσκηση είναι...με το μαλακό..ε)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Groot άσε τα ψόφια και κάνε την άσκηση! 

 

Imitheos,

ξέχασες να βάλεις αυτό:

 printf("i in main has address %p and value %d\n", (void *)&i, i);

απλά μας δείχνεις τι σου δείχνει η C++, όχι το που στο καλό είναι..Γιατί η συνάρτηση που καλείς κάπου είναι στη μνήμη και μέσα εκεί, ή στο stack ή κάπου...θα είναι μια διεύθυνση ΧΧΧ που θα περιέχει την διεύθυνση της τιμής του i.

Απλά στη C βλέπεις και αυτή την τιμή XXX...γιατί την καθορίζεις και αυτήν. Η cpp δεν σε αφήνει να το κάνεις! (ή μπορεί να έχει επιλογές..δεν γνωρίζω περισσότερα).

 

 

 

online compiler

 

http://www.tutorialspoint.com/compile_cpp_online.php

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αν μπορέσεις  Groot, να καλέσεις μια διαδικασία Α, όπως θέλεις πες το, και να περάσεις κάτι, θα μας πεις τι όμως, και σε αυτή την Α θα μπορέσεις να κάνεις πέντε κλήσεις σε αυτή που κάλεσε την Α  (δεν το γνωρίζει ο κώδικας πριν τρέξει) και να περάσεις πίσω μεταβλητές με αναφορά πρν επιστρέψει η Α στη αρχική θα σε παραδεχτώ! (αν το δεις με τη Μ2000 θα τρίβεις τα μάτια σου) (πρόσκληση για άσκηση είναι...με το μαλακό..ε)

 

Δηλαδή αν κατάλαβα καλά του ζητάς μέσα από μια function Α να έχει πρόσβαση σε μεταβλητές που ορίζονται εκτός της συνάρτησης. Κι αυτό για κάποιο λόγο το θεωρείς φοβερή μαγκιά. Το κάνει η JavaScript με τα closures. Καλως όρισες στον πραγματικό κόσμο. Αύριο θα σου μάθουμε τι είναι τα αντικείμενα. Σε καμιά τριανταριά χρόνια μπορεί να μάθεις και C#.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Groot άσε τα ψόφια και κάνε την άσκηση! 

 

Imitheos,

ξέχασες να βάλεις αυτό:

 printf("i in main has address %p and value %d\n", (void *)&i, i);

απλά μας δείχνεις τι σου δείχνει η C++, όχι το που στο καλό είναι..Γιατί η συνάρτηση που καλείς κάπου είναι στη μνήμη και μέσα εκεί, ή στο stack ή κάπου...θα είναι μια διεύθυνση ΧΧΧ που θα περιέχει την διεύθυνση της τιμής του i.

Απλά στη C βλέπεις και αυτή την τιμή XXX...γιατί την καθορίζεις και αυτήν. Η cpp δεν σε αφήνει να το κάνεις! (ή μπορεί να έχει επιλογές..δεν γνωρίζω περισσότερα).

 

 

 

online compiler

 

http://www.tutorialspoint.com/compile_cpp_online.php

 

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

Δηλαδή αν κατάλαβα καλά του ζητάς μέσα από μια function Α να έχει πρόσβαση σε μεταβλητές που ορίζονται εκτός της συνάρτησης. Κι αυτό για κάποιο λόγο το θεωρείς φοβερή μαγκιά. Το κάνει η JavaScript με τα closures. Καλως όρισες στον πραγματικό κόσμο. Αύριο θα σου μάθουμε τι είναι τα αντικείμενα. Σε καμιά τριανταριά χρόνια μπορεί να μάθεις και C#.

 

Πού να του πει κανείς τι κάνει η python!

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Elorant άσε τα ψόφια και συ..Αν γουστάρεις συμμετέχεις..στην άσκηση! Τώρα αν είναι να με μάθεις, γιατί να διαφωνήσω...στο ξύλο φεύγουμε στη γνώση μένουμε (και στο φαϊ γαμώτο..)


Groot...όταν ζητάνε κάτι της πλάκας κάνεις τον πονηρό..εδώ σε θέλω..

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Elorant το έγραψα ξεκάθαρα...θα παίρνει προφανώς κάτι που μπορεί να καλέσει και θα περνάει με αναφορά τιμές!

 

Μπορείς να πεις και για πράσινα άλογα...Κώδικα θα έχουμε;

Για να μάθει και ο OP - να μάθουμε όλοι - τι μπορεί να γίνει από τις γλώσσες που ξέρετε..

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Elorant άσε τα ψόφια και συ..Αν γουστάρεις συμμετέχεις..στην άσκηση! Τώρα αν είναι να με μάθεις, γιατί να διαφωνήσω...στο ξύλο φεύγουμε στη γνώση μένουμε (και στο φαϊ γαμώτο..)

 

Groot...όταν ζητάνε κάτι της πλάκας κάνεις τον πονηρό..εδώ σε θέλω..

 

Τι δεν καταλαβαίνεις ότι λες παπάτζες; Πως, εάν θεωρήσουμε ότι κανείς μπορεί να καταλάβει τι θέλεις, ήδη γίνεται με 1000+2 τρόπους; Και πως είσαι τόσο πουθενάς που κανείς δεν θα χαραμίσει τον καιρό του για να κάνει αυτό που λες, έστω και εάν είναι και ΜΙΑ γραμμή κώδικα;

 

Τι δεν καταλαβαίνεις από τα παραπάνω; Πόσο πιο φανερά να στα πούνε δηλαδή;

 

 

Υ.Γ. Φυσικά και θα χαραμίσει τον καιρό του για να σε κράξει, μιας και προκαλείς με την τόσο ελεεινή συμπεριφορά σου.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Πάντως δικά μας windows δεν μπορούμε να φτιάξουμε με τις γλώσσες που ξέρουμε. Οπότε κι εκεί μας κατατροπώνεις με τις γνώσεις σου.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

@Groot

Ενώ εδώ κάνεις σπουδαιότερα πράγματα...ασχολείσαι με το τι είναι By Reference...E! την άλλη φορά να μιλήσουμε για μονούς και ζυγούς αριθμούς!

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Για να μάθει και ο OP - να μάθουμε όλοι - τι μπορεί να γίνει από τις γλώσσες που ξέρετε..

 

I see what you did there.

 

Από τη στιγμή που είπες γλώσσες πληθυντικός δε θα μπορούσες να συνεχίσεις σε πρώτο πρόσωπο.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

I see what you did there.

 

Από τη στιγμή που είπες γλώσσες πληθυντικός δε θα μπορούσες να συνεχίσεις σε πρώτο πρόσωπο.

 

LOL. Σφάξιμο με το βαμβάκι!

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

  • Δημιουργία νέου...