Δεικτες σε δισδιαστατο πινακα

...ασύγχρονα μαθήματα γλώσσας C

Δεικτες σε δισδιαστατο πινακα

Δημοσίευσηαπό Garrus » 23 Απρ 2011, 14:36

Για να αναθεσεις ενα δεικτη σε εναν 2D πινακα.
Κώδικας: Επιλογή όλων
int table[4][4];
int *row1;
row1=table[1];


μπορεις να κανεις κατι αναλογο για να αναθεσεις ενα δεικτη σε μια στηλη του πινακα;
1 Γνώσεις Linux: Ελπίζω τουλ. μέτρια ┃ Προγραμματισμού: Καλή ┃ Αγγλικών: Very best englands
2 Ubuntu 15.10 wily 64bit (en_US.UTF-8),
3 Intel Core i5-3210M CPU @ 2.50GHz ‖ RAM 3843 MiB ‖ SAMSUNG ELECTRONICS CO., LTD. NP350E5C-S03GR [...]
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] (rev 09) ⋮ [AMD/ATI] Thames [Radeon HD 7500M/7600M Series] [1002:6840] (rev ff)
5 enp2s0: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller [10ec:8168] (rev 09) ⋮ wlp3s0: Qualcomm Atheros AR9485 Wireless Network Adapter [168c:0032] (rev 01)
Garrus
punkTUX
punkTUX
 
Δημοσιεύσεις: 179
Εγγραφή: 26 Ιαν 2011, 03:23
Εκτύπωση

Re: Δεικτες σε δισδιαστατο πινακα

Δημοσίευσηαπό simosx » 23 Απρ 2011, 16:15

Garrus έγραψε:Για να αναθεσεις ενα δεικτη σε εναν 2D πινακα.
Κώδικας: Επιλογή όλων
int table[4][4];
int *row1;
row1=table[1];


μπορεις να κανεις κατι αναλογο για να αναθεσεις ενα δεικτη σε μια στηλη του πινακα;


Ο πίνακας 3x3 (int table[3][3])

1 2 3
4 5 6
7 8 9

αποθηκεύεται στη μνήμη ως 1, 2, 3, 4, 5, 6, 7, 8, 9.
Οπότε το row2 = table[1]
έχει τις τιμές row2[0] = 4, row2[1] = 5, row2[2] = 6.
Αν ήταν να προσπελάσεις το row2[3], θα έβλεπες ότι έχει την τιμή 7.
Οπότε, για να εξάγεις στήλες, πρέπει να χρησιμοποιήσεις ειδικές δομές, και το πιο τυπικό πια είναι η χρήση C++ όπου οι στήλες και οι γραμμές είναι αντικείμενα.
προσωπικό ιστολόγιο ϗ πλανήτης Ubuntu-gr
Συμβάλετε και εσείς στο ελληνικό βιβλίο Ubuntu!
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.10 saucy 3.11.0-031100rc1-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 AMD E-450 APU with Radeon HD Graphics ‖ RAM 3555 MiB ‖ Sony Corporation VAIO
4 AMD nee ATI Wrestler [Radeon HD 6320] [1002:9806] {fglrx_pci}
5 eth0: Atheros Inc. AR8151 v2.0 Gigabit Ethernet [1969:1083] (rev c0) ⋮ wlan0: Atheros Inc. AR9285 [168c:002b] (rev 01)
Φτιάξτε και εσείς τη δική σας υπογραφή (παραπάνω κείμενο) αυτόματα με κλικ εδώ!
simosx
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 10334
Εγγραφή: 11 Μάιος 2008, 18:52
Launchpad: simosx
IRC: simosx
Εκτύπωση

Re: Δεικτες σε δισδιαστατο πινακα

Δημοσίευσηαπό migf1 » 03 Ιουν 2011, 17:29

Μπορείς να το κάνεις δεσμεύοντας δυναμικά μνήμη για τον πίνακά σου ως εξής:

Κώδικας: Επιλογή όλων

int main( void )
{
int nrows=5, ncols=10;
register int i,j;
int **array2d;

array2d = (int **) calloc( ncols, sizeof(int *) ); // δέσμευση μνήμης για 'ncols' δείκτες σε int (στήλες)
if ( !array2d ) // αποτυχία δέσμευσης...
return 1; // ανώμαλος τερματισμός προγράμματος

for (j=0; j < ncols; j++)
{
array2d[ j ] = (int *) calloc(nrows, sizeof(int) ); // δέσμευση μνήμης για 'nrows' int (γραμμή)
if ( !array2d[ j ] ) // αποτυχία δέσμευσης....
{ // απελευθέρωση όσων δεσμεύσαμε μέχρι τώρα
for (i=j; i > -1; i--)
free( array2d[ i ] );
return 1; // ανώμαλος τερματισμός προγράμματος
}
}

// σε αυτό το σημείο έχεις 'ncols' δείκτες (στήλες), με τον καθένα τους να δείχνει σε ένα πίνακα ακεραίων (γραμμές)
// οπότε κάνεις ότι θέλεις να κάνεις με τον 2Δ πίνακά σου

// απελευθέρωση της μνήμης που δεσμεύσαμε στην αρχή
for (j=0; j < ncols; j++)
for (i=0; i < nrows; i++)
free ( array2d[ j ][ i ] );
free( array2d );

return 0;
}
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση


Επιστροφή στο Μαθήματα C