Σχέση μεταξύ συστοιχιών και δεικτών στον προγραμματισμό C (με παραδείγματα)

Σε αυτό το σεμινάριο, θα μάθετε για τη σχέση μεταξύ συστοιχιών και δεικτών στον προγραμματισμό C. Θα μάθετε επίσης την πρόσβαση σε στοιχεία πίνακα χρησιμοποιώντας δείκτες.

Πριν μάθετε για τη σχέση μεταξύ συστοιχιών και δεικτών, φροντίστε να ελέγξετε αυτά τα δύο θέματα:

  • C Πίνακες
  • C Δείκτες

Σχέση μεταξύ συστοιχιών και δεικτών

Ένας πίνακας είναι ένα μπλοκ διαδοχικών δεδομένων. Ας γράψουμε ένα πρόγραμμα για την εκτύπωση διευθύνσεων στοιχείων πίνακα.

 #include int main() ( int x(4); int i; for(i = 0; i < 4; ++i) ( printf("&x(%d) = %p", i, &x(i)); ) printf("Address of array x: %p", x); return 0; ) 

Παραγωγή

 & x (0) = 1450734448 & x (1) = 1450734452 & x (2) = 1450734456 & x (3) = 1450734460 Διεύθυνση του πίνακα x: 1450734448 

Υπάρχει διαφορά 4 byte μεταξύ δύο διαδοχικών στοιχείων του πίνακα x. Είναι επειδή το μέγεθος intείναι 4 byte (στον μεταγλωττιστή μας).

Σημειώστε ότι, η διεύθυνση & x (0) και x είναι η ίδια. Είναι επειδή το όνομα μεταβλητής x δείχνει το πρώτο στοιχείο του πίνακα.

Από το παραπάνω παράδειγμα, είναι σαφές ότι &x(0)είναι ισοδύναμο με το x. Και, x(0)ισοδυναμεί με *x.

Ομοίως,

  • &x(1)είναι ισοδύναμο x+1και x(1)ισοδύναμο με *(x+1).
  • &x(2)είναι ισοδύναμο x+2και x(2)ισοδύναμο με *(x+2).
  • Βασικά, &x(i)είναι ισοδύναμο x+iκαι x(i)ισοδύναμο με *(x+i).

Παράδειγμα 1: Δείκτες και πίνακες

 #include int main() ( int i, x(6), sum = 0; printf("Enter 6 numbers: "); for(i = 0; i < 6; ++i) ( // Equivalent to scanf("%d", &x(i)); scanf("%d", x+i); // Equivalent to sum += x(i) sum += *(x+i); ) printf("Sum = %d", sum); return 0; ) 

Όταν εκτελείτε το πρόγραμμα, η έξοδος θα είναι:

 Εισαγάγετε 6 αριθμούς: 2 3 4 4 12 4 Άθροισμα = 29 

Εδώ, έχουμε δηλώσει έναν πίνακα x 6 στοιχείων. Για πρόσβαση στα στοιχεία του πίνακα, χρησιμοποιήσαμε δείκτες.

Στα περισσότερα περιβάλλοντα, τα ονόματα των πινάκων αποσυντίθενται σε δείκτες. Με απλά λόγια, τα ονόματα των πινάκων μετατρέπονται σε δείκτες. Αυτός είναι ο λόγος για τον οποίο μπορείτε να χρησιμοποιήσετε δείκτες για πρόσβαση σε στοιχεία συστοιχιών. Ωστόσο, πρέπει να θυμάστε ότι οι δείκτες και οι πίνακες δεν είναι οι ίδιοι .

Υπάρχουν μερικές περιπτώσεις όπου τα ονόματα των πινάκων δεν αποσυντίθενται σε δείκτες. Για να μάθετε περισσότερα, επισκεφθείτε: Πότε το όνομα του πίνακα δεν αποσυντίθεται σε δείκτη;

Παράδειγμα 2: Πίνακες και δείκτες

 #include int main() ( int x(5) = (1, 2, 3, 4, 5); int* ptr; // ptr is assigned the address of the third element ptr = &x(2); printf("*ptr = %d ", *ptr); // 3 printf("*(ptr+1) = %d ", *(ptr+1)); // 4 printf("*(ptr-1) = %d", *(ptr-1)); // 2 return 0; )

Όταν εκτελείτε το πρόγραμμα, η έξοδος θα είναι:

 * ptr = 3 * (ptr + 1) = 4 * (ptr-1) = 2

Σε αυτό το παράδειγμα, &x(2)η διεύθυνση του τρίτου στοιχείου, αντιστοιχεί στον δείκτη ptr. Ως εκ τούτου, 3εμφανίστηκε κατά την εκτύπωση *ptr.

Και, η εκτύπωση *(ptr+1)μας δίνει το τέταρτο στοιχείο. Ομοίως, η εκτύπωση *(ptr-1)μας δίνει το δεύτερο στοιχείο.

ενδιαφέροντα άρθρα...