ΟΠως λεει και o migf1 εδω εκμεταλευομαστε οτι μετα το for η τιμη ειναι 25. Ναι αλλα αυτο που ειναι ομως αποθηκευμενο??? Μεσα στο Memory layout σε ποιο σημειο ειναι το 25??? μιας και δεν εχω τιμη επιστροφης απο καποια συναρτηση ωστε να μπει στο STACK.
Το 25 (όπως κι οι υπόλοιπες τιμές του array) στο συγκεκριμένο παράδειγμα είναι αποθηκευμένες στο section που αποθηκεύονται οι αρχικοποιημένες μεταβλητές (δλδ στο data segment) μια και το array μας είναι αρχικοποιημένο.
Star_Light έγραψε:Καθως διαβαζα τα τουτοριαλ του migf1 για τα strings μου ηρθε να παιξω λιγο με τους δεικτες.
ΘΥμηθηκα και το κρυφτο που παιζαμε οταν ειμασταν μικροι που μετρουσε καποιος 5 , 10 , 15 , 20 , 25
και μετα ηθελα να το κανω και αντιστροφα!
- Κώδικας: Επιλογή όλων
/*==================================================
Aplo paradeigmataki me deiktes
ektupwsi twn stoixeiwn enos pinaka
kanonika kai stin sunexeia me tin antistrofi seira
23/7/11
Star_Light
==================================================== */
#include<stdio.h>
int main()
{
int *ip; /*integer pointer*/
int array[5]={5,10,15,20,25};
for(ip=array; ip<&array[5]; ip++)
{
printf("\n\n");
printf("%d",*ip);
}
while((*ip)!=5)
{
ip--;
printf("\n\n");
printf("%d",*ip);
}
return 0;
}
Αυτό εδώ το κομμάτι δεν είναι οκ...
- Κώδικας: Επιλογή όλων
while((*ip)!=5)
{
ip--;
printf("\n\n");
printf("%d",*ip);
}
διότι στη συνθήκη του while-loop εξετάζεις με το *ip το περιεχόμενο της διεύθυνσης μνήμης που ακολουθεί το τελευταίο στοιχείο του array. Στο for-loop είναι οκ επειδή εκεί εξετάζει τη διεύθυνση της μνήμης, μετά το τέλος του for-loop όμως ο ip εξακολουθεί να δείχνει σε εκείνη τη διεύθυνση.
Άρα πρέπει να τον πας μια θέση πίσω πριν αρχίζεις να εξετάζεις το περιεχόμενό του στη συνθήκη του while-loop...
Ένας τρόπος είναι να το κάνεις έτσι..
- Κώδικας: Επιλογή όλων
ip--;
while( *ip != 5) {
ip--;
printf("\n\n");
printf("%d",*ip);
}
Άλλος τρόπος είναι να το κάνεις έτσι...
- Κώδικας: Επιλογή όλων
while( *--ip != 5)
printf("\n%d\n", *ip);
printf("\n%d\n", *ip);