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

C + δείκτες απορία


apostolis glenis

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

Δημοσ.

>
#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 , έχω μπερδευτεί λίγο με αυτή την γραμμή..

και γενικά , εάν μπορεί κάποιος ας εξηγήσει προτεραιότητες με προθεματικόυς/μεταθεματικούς τελεστές σε σχέση με τους δείκτες..

ευχαριστώ.

Δημοσ.

 

>
#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 (θα μετακινηθεί δηλαδή στην επόμενη θέση μνήμης).

Δημοσ.

οκ , το κατάλαβα , ευχαριστώ :)

Καλημέρα, έκανα ένα λάθος χτες... το ++ μετακινεί τον μονό δείκτη μια θέση δεξιά, δηλαδή τον *ppx (κι όχι τον διπλό ppx που σου έγραψα χτες).

Δημοσ.

Απλά Μαθηματικά 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;

 

Αχχχ, Γεράσαμε ρε γμτο...

Δημοσ.

 

Είναι πολύ απλά πράγματα , που να σου εξηγώ τώρα...

 

το δικο σου, το:

>
sum += *(*ppx)++;

Σημαίνει...

>
sum = sum * (*pointer)++;
// Boreis kai poio eukola na to grapseis..
*pointer++;
sum= sum * pointer;

 

Μην με ευχαριστείς, χαρά μου να βοηθάω...

 

Αυτό που έχεις γράψει δεν ισχύει..

 

Το ισοδύναμο του είναι αυτο:

>
sum += **ppx; /* sum = sum + **ppx */
++*ppx; /* ή (*ppx)++*/

Δημοσ.

Δεν είμαι και στο 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

 

ΥΓ: Ο δεικτης δειχνει στην μνημη και οχι σε αυτη καθ'αυτη μεταβλητη...

Απλός ενα παραδειδμα ειναι πάνω

Δημοσ.

Δεν είμαι και στο PC μου για να το δω, αλλα...

 

Αυτό

>
sum += *(*ppx)++;

Είναι αυτό]

>
sum = sum *(*ppx)++;

 

σωστά μεχρι εδω?, μαθηματικα είναι ρε ;pp, τώρα παρε την απλούστερη παραπάνω μορφή

και ανάλυσέ την ακόμα...

 

Θα σε στεναχωρήσω αλλά όχι .. :P

τα δύο άστρα είναι τελεστές έμμεσης αναφοράς , το 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.. :P [FAIL]

Δημοσ.

Όπως τα λέει ο ektwr_ είναι (τσάμπα πήγε το... υφάκι στο αρχικό σου ποστ Adawn :P)

 

 

 

@ektwr_: έχεις δει τα σχόλια που έχω κάνει στη λύση που έδωσες στο πρόβλημα που είχα ανεβάσει στο greekcodes.gr ; )

 

 

Δημοσ.

Όπως τα λέει ο ektwr_ είναι (τσάμπα πήγε το... υφάκι στο αρχικό σου ποστ Adawn :P)

 

 

 

@ektwr_: έχεις δει τα σχόλια που έχω κάνει στη λύση που έδωσες στο πρόβλημα που είχα ανεβάσει στο greekcodes.gr ; )

 

 

 

Ναι , τα έχω δει αλλά δεν έχω βρεί χρόνο να το διορθώσω .. να δου πώ την αλήθεια δεν είχα καταλάβει πως θές secure κώδικα :P θα κάτσω να το φτιάξω τώρα :)

 

edit : έτοιμο :)

Δημοσ.

ποιο υφάκη..

 

εντάξει, αφου μου λέτε οτι

 

sum += *(*ppx)++;

Δεν είναι

sum = sum + *(*ppx)++;

 

...

 

Πάω να ανοίξω κανα βιβλίο... :/

 

ΥΓ:

*ppx Δεικτης

 

*(χχχχ)++;

 

1 Δεικτης που δειχνει σε δειχτη που δειχνη κάπου στην μνημη

 

Ναι λάθος μου...

 

Όπως τα λέει ο ektwr_ είναι (τσάμπα πήγε το... υφάκι στο αρχικό σου ποστ Adawn :P)

 

 

 

@ektwr_: έχεις δει τα σχόλια που έχω κάνει στη λύση που έδωσες στο πρόβλημα που είχα ανεβάσει στο greekcodes.gr ; )

 

 

 

πάλι καλά που δεν με ξέρεις ;p γιατί αμα ήξερες τι ΑΝΘΡΩΠΟΣ είμαι... τοτε μάλλον μετα απο μία τέτοια γκάφα θα αυτοκτονούσες ;p

 

Όχι φιλε, δεν ειμαι ουτε ψώνιο ουτε σκατόπαιδο, ούτε υφάκη έχω...

Δημοσ.

[offtopic]

Δεν υπάρχει λόγος για υφάκια και τσακωμούς , όλοι να βοηθήσουμε θέλουμε :)

[/offtopic]

 

>
sum += *(*ppx)++;  <=> sum = sum + *(*ppx)++;

 

Μα αυτό είναι το ίδιο πράγμα όντως! :P

 

Για να σε βοηθήσω να καταλάβεις , αυτό

>*(*ppx)++

είναι σαν να γράγεις κάτι του στύλ vector[j++]; όπου i συμβολίζει rows και j columns :)

 

εδώ έχεις ξεχάσει ένα + , το * μετα το sum δεν είναι πολλαπλασιασμός

>sum = sum * (*pointer)++;

δηλαδή θα έπρεπε να είναι

>sum = sum + *(*pointer)++;

 

ή για να γίνω ποιο κατανοητός είναι σαν να γράφεις κατι του στυλ

>sum = sum + vector[i][j++];

 

βάση του παραπάνω παραδείγματος ..

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...