Δημοσιεύτηκε: 04 Φεβ 2012, 04:02
από Star_Light
btw σαν καθαρόαιμο λαγωνικό της C που είμαι και δεν χαμπαριάζω :

Εικόνα

Uploaded with ImageShack.usέκατσα και διάβασα μερικά πράγματα και μονος μου οπως μου ειπε ο migf1 και έχω να παραθέσω αυτη τη φορά 2 παραδείγματα τα οποια ελπίζω να ειναι εντάξει και οχι μπερδεμένα πάμε :

Κώδικας: Επιλογή όλων

#include<stdio.h>
int main()
{
int **ipp;

int i = 5, j = 6 , k = 7;
int *ip1 = &i, *ip2 = &j;

ipp = &ip1; /* Eπειδή ειναι διπλός δείκτης καταρχην θα πρεπει
να αρχικοποιηθεί με την διεύθυνση ενος άλλου δείκτη
για να δείχνει σε αυτόν , τωρα δείχνει στον ip1 που δειχνει
στην θέση μνήμης η οποία έχει δεσμευτεί για την i μεταβλητή
σχηματικά θα έχουμε : ipp -> ip -> i */

printf("\n %d \t ", **ipp); //Εκτύπωση του 5

*ipp = ip2; /* Με δεδομένο οτι ο ipp έχει ήδη αρχικοποιηθεί με ip1
Το *ipp δηλαδη τα περιεχόμενα του ip1 θα πρέπει να δείχνουν
εκει που δείχνει και ο ip2 (δηλαδή στο j) τα περιεχόμενα του ip1
ειναι πλεον η διεύθυνση της j για αυτο στην πιο κάτω εκτύπωση παιρνουμε 6 */

if(*ipp == ip1)
printf(" \n You did it \t "); // Απλός έλεγχος οτι ο δείκτης του ipp ειναι ο ip1

printf("%d", **ipp); // Εκτύπωση του 6

*ipp = &k; /*O ipp απο πριν ειναι αρχικοποιημένος με ip δηλαδη ipp -> ip1
Στα περιεχόμενα του ipp (εκει που δείχνει στον ip1) βάζουμε
την διεύθυνση της k επομένως πλεον θα ειναι
ipp -> ip -> k σε αυτο το σημείο βεβαια ο ip συνεχίζει να δείχνει
στην j πραγμα που αποδεικνύεται μιας και αμα τον απο-αναφοροποιήσουμε
με τον τελεστή * θα δώσει την τιμή που έχει αποθηκευτεί στην μεταβλητή j
*/

printf ("\n%d \t" , *ip1); // Εκτύπωση του 7

printf("%d", *ip2); // Εκτύπωση του 6

printf("\t %d", **ipp); // Εκτύπωση του 7 με τον διπλό



return 0;
}


και το 2ο :

Κώδικας: Επιλογή όλων


#include<stdio.h>
int main()
{
int **p

, *p2 , b=1 , a=2 , *p3 ;

p=NULL;
p2=NULL;
p3=NULL;

p3=&b;

p = &p3; /* Στον p επειδή ειναι διπλός δείκτης βάζεις σαν δεξιά τιμή την διεύθυνση του p3 (πως θα τον "βρει" αλλιώς?)
O p δείχνει στον p3 που δείχνει στην b σχηματικά p -> p3 -> b
για αυτο λέμε άλλωστε πως ειναι ένας δείκτης σε δείκτη */

p2=(*p); /* Μπορείς να αρχικοποιήσεις εναν μονό με έναν διπλό δείκτη έτσι.
Ο p2 δείκτης δείχνει όπου και ο p με την διαφορά οτι το *p ειναι τα περιεχόμενα
του p που επειδη ειναι δείκτης ειναι η διεύθυνση μνήμης του p3 επομένως μιας και δείχνουν
στο ίδιο σημείο θα δείχνουν στο b. Αυτο σημαίνει πως με απο-αναφοροποιήση του p2 παίρνω
τα περιεχόμενα της μνήμης που έχει δεσμευτεί για την b δηλαδη το 1
O p έχει σαν περιεχόμενα του την διεύθυνση μνήμης του *p */

if(*p == p3)
printf("\n OK"); //Αποδεικνύεται οτι το *p φέρει περιεχόμενα διεύθυνσης του p3

printf("%d", *p2); // Εκτύπωση του 1

*p=&a; /* Μπορείς και έτσι να αρχικοποιήσεις εναν διπλό με την διεύθυνση
μιας άλλης μεταβλητής. Οπότε τωρα ο *p δείχνει στην περιοχή της μνήμης
που έχει δεσμευτεί για το a επομένως αν απο-αναφοροποιήσω τον δείκτη *p
προσθέτοντας αλλο ενα αστεράκι παίρνω τα περιεχόμενα αυτης της περιοχής */

printf("%d", **p); // Εκτύπωση του 2



return 0;
}


Aντε καληνύχτα -.-