Δημοσιεύτηκε: 09 Σεπ 2011, 16:39
από migf1
Τέσπα, είναι δεν είναι κατανοητό το σχέδιο, ο συμβατός κώδικας για διαχείριση διευθύνσεων δεικτών είναι κάτι σαν το παρακάτω...

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

#include <stdio.h>

typedef union ptraddress {
int **pp; // address of p
unsigned long int paddr; // address of p expressed as unsigned long
unsigned long int *p; // p itself expressed as unsigend long
} PtrAddress;

// -------------------------------------------------------------------------------------
int main( void )
{

int n = 10, *p = &n;
PtrAddress ptraddress; // ή με αρχικοποίηση: ptraddress = { .pp = &p };

ptraddress.pp = &p;
printf("h dieythynsh toy p einai:\t%lu\n", ptraddress.paddr);

printf("o p periexei th dieythynsh:\t%lu\n", *(ptraddress.p) );

printf("h dieythynsh sthn opoia deixnei o p periexei thn timh:\t%d\n",
**ptraddress.pp );

return 0;
}

Και η λογική του είναι πως για να μη χρειάζεται να καταφεύγουμε σε casting (μιας και το cast από δείκτη σε απρόσημο ακέραιο είναι πλέον ασύμβατο) ορίζουμε έναν δείκτη στον δείκτη του οποίου τη διεύθυνση (αλλά και τα περιεχόμενα) θέλουμε να διαχειριστούμε. Δείκτη σε δείκτη δηλαδή.

Αν int *p είναι ο δείκτης μας, ορίζουμε τον int **pp να δείχνει στη διεύθυνση του p: pp = &p; Και αυτή την διεύθυνση την εκφράζουμε ως unsigned long βάζοντας την μαζί με τον διπλό δείκτη μας μέσα σε ένα union:
Κώδικας: Επιλογή όλων

typedef union ptraddress {
int **pp; // address of p
unsigned long int paddr; // address of p expressed as unsigned long
} PtrAddress;

Οπότε διαβάζουμε τη διεύθυνση του p ως δείκτη σε δείκτη: ptraddress.pp = &p; αλλά κατόπιν μπορούμε να τη διαχειριστούμε ελεύθερα σαν να ήταν unsigned long μέσω του: ptraddress.paddr
Κώδικας: Επιλογή όλων

printf("h dieythynsh toy p einai:\t%lu\n", ptraddress.paddr);


Αν τώρα θέλουμε να διαχειριστούμε ως unsigned long όχι μόνο τη διεύθυνση του p αλλά και τη διεύθυνση που περιέχει ο p μέσα του (η οποία είναι η διεύθυνση στην οποία δείχνει ο p) τότε αρκεί να προσθέσουμε μέσα στο union άλλο ένα πεδίο που θα μονός δείκτης αλλά όχι σε int που είναι ο p, αλλά σε unsigned long int που θέλουμε να μετατραπεί).

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

typedef union ptraddress {
int **pp; // address of p
unsigned long int paddr; // address of p expressed as unsigned long
unsigned long int *p; // p itself expressed as unsigend long
} PtrAddress;

Η αρχική ανάθεση παραμένει η ptraddress.pp = &p; για να μην έχουμε διένεξη τύπων κατά την ανάθεση (type conflict) μόνο που τώρα μπορούμε να διαχειριστούμε ΚΑΙ τη διεύθυνση που περιέχει ο p ως unsigned long, μέσω του ptraddress.p...
Κώδικας: Επιλογή όλων

printf("o p periexei th dieythynsh:\t%lu\n", *(ptraddress.p) );

Και η τελική τιμή (του n δηλαδή) είναι προσβάσιμη μέσω του: **ptraddress.pp ...
Κώδικας: Επιλογή όλων

printf("h dieythynsh sthn opoia deixnei o p periexei thn timh:\t%d\n",
**ptraddress.pp );


!!! ΚΑΤΑΛΑΒΑΙΝΩ ΠΩΣ ΕΧΕΙ ΧΑΘΕΙ ΤΕΛΕΙΩΣ Η ΜΠΑΛΑ... ΔΕΝ ΠΕΙΡΑΖΕΙ... ΜΗΝ ΧΑΛΙΕΣΤΕ... ΑΥΤΑ ΕΙΝΑΙ ΟΝΤΩΣ ADVNACED ΠΡΑΓΜΑΤΑ !!!!

Επιστρέφουμε στα strings ή θέλετε να πιάσουμε δομές και πίνακες;