apostolis glenis Δημοσ. 10 Αυγούστου 2011 Δημοσ. 10 Αυγούστου 2011 > #include <stdio.h> #include <stdlib.h> int main(void){ int i,j,*px[3],**ppx,sum = 0; for(i=0;i<3;i++){ px[i]=malloc((i+2) * sizeof(int)); if(px[i] == NULL) return -1; } for(i=0;i<3;i++){ for(j=0;j<i+2;j++){ *(px[i]+j) = i*j; printf("px[%d][%d] = %d\n",i,j,*(px[i]+j)); } printf("\n"); } ppx = px; for(i=0;i<3;i++){ for(j=0;j<i+2;j++) sum += *(*ppx)++; /* εδω, θα πάρουμε πρώτα το περιεχόμενο του **px και μετα θα αυξηθεί ο *ppx να δείχνει στην επόμενη θέση μνήμης (+sizeof int δηλαδή) ? */ ppx++; } printf("sum = %d\n",sum); } ότι λέει το comment , έχω μπερδευτεί λίγο με αυτή την γραμμή.. και γενικά , εάν μπορεί κάποιος ας εξηγήσει προτεραιότητες με προθεματικόυς/μεταθεματικούς τελεστές σε σχέση με τους δείκτες.. ευχαριστώ.
migf1 Δημοσ. 10 Αυγούστου 2011 Δημοσ. 10 Αυγούστου 2011 > #include <stdio.h> #include <stdlib.h> int main(void){ int i,j,*px[3],**ppx,sum = 0; for(i=0;i<3;i++){ px[i]=malloc((i+2) * sizeof(int)); if(px[i] == NULL) return -1; } for(i=0;i<3;i++){ for(j=0;j<i+2;j++){ *(px[i]+j) = i*j; printf("px[%d][%d] = %d\n",i,j,*(px[i]+j)); } printf("\n"); } ppx = px; for(i=0;i<3;i++){ for(j=0;j<i+2;j++) sum += *(*ppx)++; /* εδω, θα πάρουμε πρώτα το περιεχόμενο του **px και μετα θα αυξηθεί ο *ppx να δείχνει στην επόμενη θέση μνήμης (+sizeof int δηλαδή) ? */ ppx++; } printf("sum = %d\n",sum); } ότι λέει το comment , έχω μπερδευτεί λίγο με αυτή την γραμμή.. και γενικά , εάν μπορεί κάποιος ας εξηγήσει προτεραιότητες με προθεματικόυς/μεταθεματικούς τελεστές σε σχέση με τους δείκτες.. ευχαριστώ. > ... sum += *(*ppx)++; ... Πρώτα το (*ppx) θα σου δώσει το περιεχόμενο της μνήμης στην οποία δείχνει ο ppx (που θα είναι ένας μονός δείκτης, μιας και το ppx είναι διπλός δείκτης). Κατόπιν λόγω του * μπροστά από την παρένθεση θα προστεθεί στο sum το περιεχόμενο της μνήμης στην οποία δείχνει ο μονός δείκτης. Τέλος, λόγω του ++ θα αυξηθεί κατά 1 ο διπλός δείκτης ppx (θα μετακινηθεί δηλαδή στην επόμενη θέση μνήμης).
apostolis glenis Δημοσ. 10 Αυγούστου 2011 Μέλος Δημοσ. 10 Αυγούστου 2011 οκ , το κατάλαβα , ευχαριστώ
migf1 Δημοσ. 10 Αυγούστου 2011 Δημοσ. 10 Αυγούστου 2011 οκ , το κατάλαβα , ευχαριστώ Καλημέρα, έκανα ένα λάθος χτες... το ++ μετακινεί τον μονό δείκτη μια θέση δεξιά, δηλαδή τον *ppx (κι όχι τον διπλό ppx που σου έγραψα χτες).
Adawn Δημοσ. 15 Αυγούστου 2011 Δημοσ. 15 Αυγούστου 2011 Απλά Μαθηματικά 5ης Δημοτικού Φιλε... Ας το κάνουμε λιανά... Όταν ο τελεστής είναι μπροστά > ++x; --x; Σημαίνει οτι το χ πρώτα θα αυξηθεί και μετά θα εκτελεσθεί Οταν βλέπεις αυτό: > MyMom += MyChild Σημαίνει αυτο: > MyMom = MyMom + Myhild; Είναι πολύ απλά πράγματα , που να σου εξηγώ τώρα... το δικο σου, το: > sum += *(*ppx)++; Σημαίνει... > sum = sum * (*pointer)++; // Boreis kai poio eukola na to grapseis.. *pointer++; sum= sum * pointer; Μην με ευχαριστείς, χαρά μου να βοηθάω... ΥΓ: Σχετικά με τους Pointers, είναι απλά Λοιπόν Τζουτζούκ... > // dhlwsh enos deikth typou Integer int *swat; //Dhlwsh enos deikth typou Integer kai ARXEIKOPOIHSH int *swat = 10; // Mia apo ta eidia, aplos exoume DYNAMIKH EGXWRHSH int *swat = new Int(10); //Aplh metablhth int what; // Edw eimaste... // O deikths twra deixnei ston what swat = &what; // Kanontas auto edw *swat = 5; // Einai san na kaneis auto what = 5; Αχχχ, Γεράσαμε ρε γμτο...
ektwr_ Δημοσ. 15 Αυγούστου 2011 Δημοσ. 15 Αυγούστου 2011 Είναι πολύ απλά πράγματα , που να σου εξηγώ τώρα... το δικο σου, το: > sum += *(*ppx)++; Σημαίνει... > sum = sum * (*pointer)++; // Boreis kai poio eukola na to grapseis.. *pointer++; sum= sum * pointer; Μην με ευχαριστείς, χαρά μου να βοηθάω... Αυτό που έχεις γράψει δεν ισχύει.. Το ισοδύναμο του είναι αυτο: > sum += **ppx; /* sum = sum + **ppx */ ++*ppx; /* ή (*ppx)++*/
Adawn Δημοσ. 15 Αυγούστου 2011 Δημοσ. 15 Αυγούστου 2011 Δεν είμαι και στο PC μου για να το δω, αλλα... Αυτό > sum += *(*ppx)++; Είναι αυτό > sum = sum *(*ppx)++; σωστά μεχρι εδω?, μαθηματικα είναι ρε ;pp, τώρα παρε την απλούστερη παραπάνω μορφή και ανάλυσέ την ακόμα... Κοιτα πάνω τι έχεις... το sum είναι το αποτέλεσμα του sum * (*ppx)++; πρώτα παρένθεση..., ας πούμε οτι ο δείκτης ppx δείχνει σε μια μεταβλητή α > int A = 10; *ppx = &A; Τότε το: > sum = sum * (*ppx)++; δεν είναι ίδιο με: > sum = sum * (A)++; // Poio Eukola Αφου πρώτα παρενθεσεις... (A)++; = 11 ΆΡΑ > sum = sum * 11; Ggmceta File, einai p einai kapos oi Deiktes, kanei kai zecti ;pp ΥΓ: Ο δεικτης δειχνει στην μνημη και οχι σε αυτη καθ'αυτη μεταβλητη... Απλός ενα παραδειδμα ειναι πάνω
ektwr_ Δημοσ. 15 Αυγούστου 2011 Δημοσ. 15 Αυγούστου 2011 Δεν είμαι και στο PC μου για να το δω, αλλα... Αυτό > sum += *(*ppx)++; Είναι αυτό] > sum = sum *(*ppx)++; σωστά μεχρι εδω?, μαθηματικα είναι ρε ;pp, τώρα παρε την απλούστερη παραπάνω μορφή και ανάλυσέ την ακόμα... Θα σε στεναχωρήσω αλλά όχι .. τα δύο άστρα είναι τελεστές έμμεσης αναφοράς , το ppx είναι δείκτης σε δείκτη επομένως έχεις >sum = sum + *(*ppx)++; Αναλυτικότερα: έχεις ενα διδιάστατο array δηλαδή ένα διπλό δείκτη το **ppx αναφέρεται σε κάποιο στοιχείο αυτού του array (γραμμή/στήλη) ενώ το *ppx σε κάποια "στήλη" το ppx είναι δείκτης στο στοίχειο στην θέση (0,0) (αναφέρεται στις γραμμές) με το (*ppx) ουσιαστικά πέρνουμε την στήλη , το ++ αναφέρεται στο (*ppx) λόγω προτεραιότητας, αλλα θα εφαρμοσθεί μεταθεματικά δηλαδή αφού παρουμε το **ppx και το αθροίσουμε στο sum.. (δηλαδή θά έχουμε >sum += **ppx ; (*ppx)++ ; το * εδώ ΔΕΝ είναι πολλαπλασιασμός ποιο κάτω γράφεις πρώτα παρένθεση..., ας πούμε οτι ο δείκτης ppx δείχνει σε μια μεταβλητή α int A = 10; *ppx = &A; όμως το ppx είναι ορισμένο ώς int **ppx; που δεν μπορείς να το κάνεις Οπότε απλά υποθέτω πως δεν διάβασες καλα την ερώτηση.. Δεν ξέρω εάν κατάλαβες αυτα που γράφω , δεν το έχω καθόλου στο να εξηγώ πράγματα... :/ ζέστη indeed , αλλά εάν δεν έχεις λεφτά για διακοπές κάθεσαι και καίγεσαι στα fora.. [FAIL]
migf1 Δημοσ. 15 Αυγούστου 2011 Δημοσ. 15 Αυγούστου 2011 Όπως τα λέει ο ektwr_ είναι (τσάμπα πήγε το... υφάκι στο αρχικό σου ποστ Adawn ) @ektwr_: έχεις δει τα σχόλια που έχω κάνει στη λύση που έδωσες στο πρόβλημα που είχα ανεβάσει στο greekcodes.gr ; )
ektwr_ Δημοσ. 15 Αυγούστου 2011 Δημοσ. 15 Αυγούστου 2011 Όπως τα λέει ο ektwr_ είναι (τσάμπα πήγε το... υφάκι στο αρχικό σου ποστ Adawn ) @ektwr_: έχεις δει τα σχόλια που έχω κάνει στη λύση που έδωσες στο πρόβλημα που είχα ανεβάσει στο greekcodes.gr ; ) Ναι , τα έχω δει αλλά δεν έχω βρεί χρόνο να το διορθώσω .. να δου πώ την αλήθεια δεν είχα καταλάβει πως θές secure κώδικα θα κάτσω να το φτιάξω τώρα edit : έτοιμο
Adawn Δημοσ. 15 Αυγούστου 2011 Δημοσ. 15 Αυγούστου 2011 ποιο υφάκη.. εντάξει, αφου μου λέτε οτι sum += *(*ppx)++; Δεν είναι sum = sum + *(*ppx)++; ... Πάω να ανοίξω κανα βιβλίο... :/ ΥΓ: *ppx Δεικτης *(χχχχ)++; 1 Δεικτης που δειχνει σε δειχτη που δειχνη κάπου στην μνημη Ναι λάθος μου... Όπως τα λέει ο ektwr_ είναι (τσάμπα πήγε το... υφάκι στο αρχικό σου ποστ Adawn ) @ektwr_: έχεις δει τα σχόλια που έχω κάνει στη λύση που έδωσες στο πρόβλημα που είχα ανεβάσει στο greekcodes.gr ; ) πάλι καλά που δεν με ξέρεις ;p γιατί αμα ήξερες τι ΑΝΘΡΩΠΟΣ είμαι... τοτε μάλλον μετα απο μία τέτοια γκάφα θα αυτοκτονούσες ;p Όχι φιλε, δεν ειμαι ουτε ψώνιο ουτε σκατόπαιδο, ούτε υφάκη έχω...
ektwr_ Δημοσ. 15 Αυγούστου 2011 Δημοσ. 15 Αυγούστου 2011 [offtopic] Δεν υπάρχει λόγος για υφάκια και τσακωμούς , όλοι να βοηθήσουμε θέλουμε [/offtopic] > sum += *(*ppx)++; <=> sum = sum + *(*ppx)++; Μα αυτό είναι το ίδιο πράγμα όντως! Για να σε βοηθήσω να καταλάβεις , αυτό >*(*ppx)++ είναι σαν να γράγεις κάτι του στύλ vector[j++]; όπου i συμβολίζει rows και j columns εδώ έχεις ξεχάσει ένα + , το * μετα το sum δεν είναι πολλαπλασιασμός >sum = sum * (*pointer)++; δηλαδή θα έπρεπε να είναι >sum = sum + *(*pointer)++; ή για να γίνω ποιο κατανοητός είναι σαν να γράφεις κατι του στυλ >sum = sum + vector[i][j++]; βάση του παραπάνω παραδείγματος ..
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.