
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ντε καληνύχτα -.-



