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

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

Δημοσ.

καλησπερα σας θελω μια απλη και συντομη απαντηση.

Σε μαι δομη δηλωμενο πριν την main(), 

struct test
    {
        int data;

    };

struct test res[5], *pres;

int main()
{
    int i, *p, x;

    pres = res;

    for(i=0; i<5; i++)
    {
        scanf("%d", &(pres+i)->data);    //το (pres+i)->data == (*pres+i).data == res[i].data == pres[i].data
    }


.......
.......
.......
system("PAUSE");
return 0;

το (pres+i)->data με το (*pres+i).data με το res.data και το pres.data ειναι ακριβως ισοδυναμα σωστα?

  • Moderators
Δημοσ.

Το (*pres+i).data δε σου χτυπάει; Μήπως εννοείς *(pres+1).data; Και στο pres.data θα περίμενα να σου χτυπάει, μιας και το pres έχει μέγεθος 1.

Δημοσ.

καλησπερα ολα μια χαρα βγαινουν, το pres.data κανενα προβλημα, αλλα και τα υπολοιπα 2.

 

απλα το (*pres+i).data ηταν λαθος. Το σωστο ειναι (*(pres+i)).data;

 

αφου αν pres->data == (*pres).data ΤΟΤΕ  (pres+i)->data == (*(pres+i)).data

 

εγω δοκιμασα και με τους 4 τροπους και βγενουν σωστα αποτελεσματα, ελπιζω να μην υπαρχει κινδυνος κρεμασματος του προγραμματος.

Δημοσ.

struct test res[5], *pres;

 

το (pres+i)->data με το (*pres+i).data με το res[i].data και το pres[i].data ειναι ακριβως ισοδυναμα σωστα?

Σύντομη και απλή απάντηση: όχι. 

 

Λιγότερη σύντομη απάντηση:

 

Το res[i].data είναι σωστό. Έχεις ένα πίνακα από δομές test το res[i] είναι ένα στοιχείο του πίνακα δηλαδή μια δομή test. Έπειτα προσπελαύνεις το data της δομής.

 

Το pres[i].data είναι επίσης σωστό λόγω του τρόπου μεταχείρισης δεικτών και πινάκων στην C. Το pres είναι ένας δείκτης σε δομή test. Η γραφή pres[i] ισοδυναμεί με το να μετακινήσεις τον δείκτη i θέσεις δεξιά και μετά να προσπελάσεις και πάλι το data. Σημειωτέον ότι είναι σωστό μόνο επειδή λες pres = res οπότε του δίνεις μια valid θέση και μόνο για τόσο μεγάλο i όσο έχεις δεσμεύει στον res.

 

Το (pres+i)->data είναι επίσης σωστό. Επειδή στην C οι πίνακες χρησιμοποιούνται πολύ συχνά, υπάρχει η συντόμευση -> για να ευκολύνει τον προγραμματιστή. Η λειτουργία είναι κάνουμε dereference ό,τι υπάρχει αριστερά και έπειτα (γνωρίζοντας ότι αυτό είναι δομή) προσπελαύνουμε το στοιχείο data. Η ισοδύναμη έκφραση είναι *(pres+i).data.

 

Έχοντας δηλαδή τον δείκτη pres να δείχνει στην αρχή του πίνακα res, αυξάνουμε κατά i θέσεις ώστε να δείχνουμε στην i-οστή θέση του πίνακα. Αυτό όμως συνεχίζει να είναι δείκτης οπότε με το * κάνουμε dereference και έτσι έχουμε μια δομή και μπορούμε με την . να δούμε το μέλος data.

 

Η έκφραση (*pres+i).data είναι λάθος και θα πρέπει να σου βαρέσει όπως είπε ο kersyn. Όταν κάνεις derefence τον pres με τον αστερίσκο έχεις το ισοδύναμο μιας δομής οπότε δεν μπορείς να του προσθέσεις το i.

 

Και στο pres[i].data θα περίμενα να σου χτυπάει, μιας και το pres έχει μέγεθος 1.

Το pres γιατί έχει μέγεθος 1 ? Εφόσον δείχνει στην διεύθυνση του πίνακα res μπορείς να προσπελάσεις (δόκιμα - νόμιμα) 5 θέσεις.
  • Moderators
Δημοσ.

Το pres γιατί έχει μέγεθος 1 ? Εφόσον δείχνει στην διεύθυνση του πίνακα res μπορείς να προσπελάσεις (δόκιμα - νόμιμα) 5 θέσεις.

 

Ναι δίκιο έχεις.

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

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

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

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

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

Σύνδεση

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

Συνδεθείτε τώρα
  • Δημιουργία νέου...