Δημοσιεύτηκε: 08 Σεπ 2011, 13:13
από migf1
Star_Light έγραψε:...θελω να πω αυτο σιγουρα δεν ειναι υλη που διδασκεται σε αρχαριους εσυ τι λες?


Κανονικά αυτά θα έπρεπε να διδάσκονται όταν διδάσκονται οι δείκτες (δεν ξέρω σε ποιο έτος διδάσκονται, νομίζω το 1ο εφόσον μιλάμε για εξειδικευμένη σχολή πληροφορικής).

Πιο advanced είναι άλλα πράγματα, π.χ. η χρήση unions για να διαβάζεις και να τυπώνεις με συμβατό (portable) τρόπο τη διευθύνσεις δεικτών. Μη χαλαστείς αν δεν καταλάβεις τίποτα από το παρακάτω :lol: ... το δείχνω ως απλό δείγμα πιο προχωρημένων πραγμάτων (αν και το πρώτο μισό της main() θα πρέπει να είναι απόλυτα κατανοητό με τα όσα έχουμε πει μέχρι τώρα περί δεικτών).

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

#include <stdio.h>

typedef struct ptraddresses {
union pp {
int **ptr;
unsigned long int address;
} pp;
union p {
int *ptr;
unsigned long int address;
} p;
} PtrAddresses;

// ---------------------------------------------------------------------
int main( void )
{
int n = 10, *p;
PtrAddresses portable = { {0UL}, {0UL} };

p = &n; //ή p = NULL; // αν το αφήσουμε μη-αρχικοποιημένο ρισκάρουμε seg-fault

// μη συμβατός τρόπος (implementation dependent, σύμφωνα με το C99 στάνταρ)

puts("NON_PORTABLE WAY(implentation defined)\n--------------------------------");
printf("memory address of p is : %lu\n", (unsigned long) &p );
printf("\tp points at address: %lu\n", (unsigned long) p );
if ( p != NULL )
{ // αν το p ΔΕΝ είναι αρχικοποημένο, το *p παράγει seg-fault
printf("\twhich contains the value: %d\n", *p);
}

putchar('\n');

// συμβατός τρόπος (δουλεύει εγγυημένα σε όλους τους compilers)

portable.pp.ptr = &p;
portable.p.ptr = p;

puts("PORTABLE WAY (works on all compilers)\n---------------------------------");
printf("memory address of p is : %lu\n", portable.pp.address );
printf("\tp points at address: %lu\n", portable.p.address );
if ( p != NULL )
{ // αν το p ΔΕΝ είναι αρχικοποημένο, το *(portable.p.ptr) παράγει seg-fault
printf("\twhich contains the value: %d\n", *(portable.p.ptr) );
}

putchar('\n');

return 0;
}