Δείκτες και δυναμικές δομές δεδομένων

Διομήδης Σπινέλλης
Τμήμα Διοικητικής Επιστήμης και Τεχνολογίας
Οικονομικό Πανεπιστήμιο Αθηνών
dds@aueb.gr

Διάταξη των δεδομένων και του κώδικα στη μνήμη

Δήλωση δεικτών

Ο τελεστής &

Χρήση δεικτών

Κλήση κατ' αναφορά

Αριθμητική με δείκτες

Ο τελεστής sizeof

Δυναμική διάθεση μνήμης

Φροντιστηριακές ασκήσεις

  1. Συμπληρώστε τον πίνακα με τις τιμές των μεταβλητών μετά την εκτέλεση κάθε μιας από τις παρακάτω εντολές.
            int a, b, c;
            int *ip1, *ip2, *ip3;

            a = 3;
            b = 4;
            ip1 = &a;
            *ip1 = 8;
            ip3 = &c;
            ip2 = ip3;
            b = *ip1;
            *ip2 = *ip1;
    a b c ip1 ip2 ip3
    Αρχή - - - - - -
    a = 3 3 - - - - -
    b = 4 3 4 - - - -
    ip1 = &a 3 4 - &a - -
    *ip1 = 8            
    ip3 = &c            
    ip2 = ip3            
    b = *ip1            
    *ip2 = *ip1            
  2. Υπολογίστε τους τύπους των εκφράσεων δεξιά και αριστερά από κάθε ανάθεση και γράψτε ποιες από τις παρακάτω γραμμές είναι σωστές και ποιες όχι.
            int a, b, c, *p1, *p2, *p3;
            double da, db, dc, *pd1, *pd2, *pd3;

            p1 = &a;
            *p1 = 4;
            p2 = &p1;
            *p2 = *c;
            p3 = a;
            p2 = p3;
            pd1 = p2;
            pd2 = &da;
            dc = *pd3;
            db = *p2;
            &a = 43;

Ασκήσεις

Δυναμική χρήση της μνήμης

  1. Να σχεδιάσετε και να γράψετε ένα πρόγραμμα το οποίο τυπώνει τους χαρακτήρες που διαβάζει με την ανάποδη σειρά. Δεν πρέπει να υπάρχει περιορισμός από το πρόγραμμα στον αριθμό των χαρακτήρων που να μπορεί να δεχτεί.
  2. Το παρακάτω πρόγραμμα προσθέτει διανύσματα ν διαστάσεων:
    /*
     * Add two vectors
     *
     * Diomidis Spinellis, December 1998
     */

    #include <stdio.h>

    /*
     * Print the contents of vector v consisting of n elements
     */
    void
    vector_print(double v[], int n)
    {
            int i;

            putchar('(');
            for (i = 0; i < n; i++) {
                    printf("%g", v[i]);
                    if (i < n - 1)
                            printf(", ");
            }
            putchar(')');
    }


    /*
     * Input a vector v consisting of n elements
     */
    void
    vector_input(double v[], int n)
    {
            int i;

            for (i = 0; i < n; i++) {
                    printf("\tEnter element %d: ", i);
                    scanf("%lg", &v[i]);
            }
    }


    /*
     * Sum vector a and vector b to vector c
     * All vectors consist of n elements
     */
    void
    vector_add(double a[], double b[], double c[], int n)
    {
            int i;

            for (i = 0; i < n; i++)
                    c[i] = a[i] + b[i];
    }

    main()
    {
            int nelem;
            double a[10], b[10], c[10];

            printf("Enter number of vector elements: ");
            scanf("%d", &nelem);
            if (nelem > sizeof(a) / sizeof(double)) {
                    printf("Vector size too large.  The maximum vector size is %d.\n",
                            sizeof(a) / sizeof(double));
                    return (1);
            }
            printf("Enter vector a\n");
            vector_input(a, nelem);
            printf("Enter vector b\n");
            vector_input(b, nelem);
            vector_add(a, b, c, nelem);
            vector_print(a, nelem);
            putchar('+');
            vector_print(b, nelem);
            putchar('=');
            vector_print(c, nelem);
    }
    1. Να το μεταγλωττίσετε και να το δοκιμάσετε στη μορφή που είναι.
    2. Να το αλλάξετε έτσι ώστε να μην έχει περιορισμό ως προς το μέγεθος των διανυσμάτων που μπορεί να δεχτεί.
    3. Να το αλλάξετε έτσι ώστε να μην εμφανίζονται καθόλου σε αυτό οι χαρακτήρες [ και ] (χρησιμοποιήστε δείκτες αντί για πίνακες).

Βιβλιογραφία