Πινακες και Δεικτες στη C

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

Re: Πινακες και Δεικτες στη C

Δημοσίευσηαπό sorolop » 16 Ιαν 2010, 15:01

Αν εχεις μνοδιαστατο πινακα μπορεις να τον επιστρεψεις απο μια συναστηση.Οπως λεει ο Νισοκ ο μονοσιαστατος πινακας ειναι ουσιαστηκα ενα δεικτης.
Αρα μπορεις να κανεις μια συναρτηση
Κώδικας: Επιλογή όλων
int * foo(int * a){a[0]=1;......... return a;}
.
Στη main μετα αν εχεις π.χ int array[10]={...}; μπορεις να κανεις int arr[10];
arr=foo(array);
Oμοια ενας δυσδιαστατος πινακας ειναι ενας int ** :)
Γνώσεις ⇛ Linux: Χαμηλό ┃ Προγραμματισμός: Ναι ┃ Αγγλικά: Μέτρια
Desktop
Λειτουργικό σε Η/Υ: Ubuntu 9.10 (karmic)
Προδιαγραφές ⇛ Intel(R) Core(TM)2 Duo CPU E8200 @ 2.66GHz │ RAM 4021 MB │ Nvidia GeForce 8800 GT │ Κάρτα ήχου: Intel 82801G HD
Άβαταρ μέλους
sorolop
babeTUX
babeTUX
 
Δημοσιεύσεις: 146
Εγγραφή: 11 Σεπ 2008, 17:43
Τοποθεσία: Δομοκός
Εκτύπωση

Re: Πινακες και Δεικτες στη C

Δημοσίευσηαπό sorolop » 16 Ιαν 2010, 15:35

Κώδικας: Επιλογή όλων
#include <iostream>
#include <string>
#include <typeinfo>
using namespace std;
int ** foo(int ** arr);
int main(void)
{
int a[2][2]={{1,2},{3,4}};
int *o[2];
o[0]=a[0];
o[1]=a[1];
int **p=o;
cout<<p[1][1]<<"\n";
p=foo(p);
cout<<p[1][1]<<"\n";
return 0;
}
int ** foo(int ** arr)
{
arr[1][1]=10;
return arr;
}

Δες λιγο αυτο: ειναι c++βασικα αλλα το μονο που αλλαζει ειναι το cout<< που ειναι ιδιο με το printf().
Αρχιζεις με ενα ππινακα 2*2 τον α,Κανεις ενα πινακα απο δεικτες τον ο και μετα ενα δεικτη σε δεικτη τον p.
Περνας στην συναρτηση foo() τον p.!!!Πειραζεις τον arr οσο θελεις!!! και τον επιστρεφεις στον δεικτη σε δεικτη τον p.Πλεον δες λιγο ενω πριν ειχες p[][]=1,2,3,4 τωρα εχεις p[][]={1,2,3,10}
Η c/c++ σου επιτρεπει ετσι να πειραξεις ενα πινακα και να δεις τις αλλαγες του στη main.
Κολπα οπως global μεταβηλτες κτλ επειδη τωρα αρχιζεις c ποτε να μη τα χρησιμοποιησεις.
Γνώσεις ⇛ Linux: Χαμηλό ┃ Προγραμματισμός: Ναι ┃ Αγγλικά: Μέτρια
Desktop
Λειτουργικό σε Η/Υ: Ubuntu 9.10 (karmic)
Προδιαγραφές ⇛ Intel(R) Core(TM)2 Duo CPU E8200 @ 2.66GHz │ RAM 4021 MB │ Nvidia GeForce 8800 GT │ Κάρτα ήχου: Intel 82801G HD
Άβαταρ μέλους
sorolop
babeTUX
babeTUX
 
Δημοσιεύσεις: 146
Εγγραφή: 11 Σεπ 2008, 17:43
Τοποθεσία: Δομοκός
Εκτύπωση

Re: Πινακες και Δεικτες στη C

Δημοσίευσηαπό OSRipper » 25 Μαρ 2010, 00:25

Βασικά στην γλώσσα προγραμματισμού C δεν μπορείς να επιστρέψεις τον πίνακα γιατί πολύ απλά δεν χρειάζεται.Στην C όταν στέλνεις έναν πίνακα σε μία συνάρτηση ως όρισμα τότε η γλώσσα περνάει τον πίνακα με αναφορά αυτόματα,αυτό φυσικά δεν συμβαίνει με τις μεταβλητές.

Το ότι η γλώσσα περνάει τον πίνακα με αναφορά σημαίνει ότι ότι αλλαγές κάνεις στον πίνακα παραμένουν και τις βλέπουν όλες οι συναρτήσεις που έχουν μέσα τον πίνακα συνεπώς και η main.

Ελπίζω να σε κάλυψα. ;) ;) ;) ;) ;) ;)
Rip The System...
Άβαταρ μέλους
OSRipper
babeTUX
babeTUX
 
Δημοσιεύσεις: 13
Εγγραφή: 20 Μαρ 2010, 05:04
Εκτύπωση

Re: Πινακες και Δεικτες στη C

Δημοσίευσηαπό migf1 » 10 Ιουν 2011, 16:50

Nisok έγραψε:Δεν γίνεται αυτό που ζητάς.
Μπορείς να βάλεις ως όρισμα ένα πίνακα, αλλά δεν μπορείς να τον επιστρέψεις.
Αυτό που μπορείς να κάνεις είναι η κλίση αναφοράς. Βάζεις όρισμα ένα δείκτη σε πίνακα επεξεργάζεσαι τον δείκτη
και δεν επιστρέφεις τίποτα, γιατί οι αλλαγές γίνονται αμέσως.
[snip]

Βασικά μπορείς να τον επιστρέψεις, ως δείκτη (με το κατάλληλο casting).

Π.χ.:

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

#include <stdio.h>
#include <stdlib.h>

#define NROWS 6
#define NCOLS 12

// ------------------------------------------------------
int **init_tab( const int nrows, const int ncols, int table[][ncols] )
{
register int i,j;

for (i=0; i < nrows; i++)
for (j=0; j < ncols; j++)
table[i][j] = i * ncols + j;

return (int **)table;
}

// ------------------------------------------------------
void print_tab( const int nrows, const int ncols, int table[][ncols] )
{
register int i,j;
for (i=0; i < nrows; i++)
for (j=0; j < ncols; j++)
printf("[%d, %d] = %d\n", i, j, table[i][j] );
}

// ------------------------------------------------------
int main( void )
{
int tab[ NROWS ][ NCOLS ] = { {0,0} };

print_tab( NROWS, NCOLS, (int (*)[NCOLS]) init_tab( NROWS, NCOLS, tab ) );

exit(0);
}

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

Προηγούμενη

Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι