Προς το περιεχόμενο

Δείκτες στη C


priest91

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα παιδιά,επειδή δεν εχούμε κάνει ακόμα δείκτες στη σχολή και τους μαθαίνω μόνος μου,έχω μια απόρια στους δισδιάστατους πίνακες..

 

Θα ήθελα να μου γραψετε ενα μικρο παραδειγμα,οπου μια συναρτηση θα δεχεται ως ορισμα εναν δισδιαστατο πινακα τον οποιο να μπορω να τον επεξεργαστω στη συναρτηση και να τον επιστρεψω στην main():-D.Ευχαριστω προκαταβολικα..

Δημοσ.

δες αυτό

 

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

void all2(int **, int, int);

void all2(int **array, int nrows, int ncolumns){
int i, j;
for(i = 0; i < nrows; i++){
	for(j = 0; j < ncolumns; j++)
		array[i][j] = 2;
}
}

void printarray(int **array, int nrows, int ncolumns){
int i, j;
for(i = 0; i < nrows; i++){
	for(j = 0; j < ncolumns; j++)
		printf(" %d ",array[i][j]);
printf("\n");
}

}
int main(){
int **array;//2Δ πίνακας ακεραίων
int i,nrows=10,ncolumns=2;//γραμμές και στήλες πίνακα

array = (int **)malloc(nrows * sizeof(int *));//φτιάχνω τις γραμμές δυναμικά
if(array == NULL)//αν δεν φτάνει η μνήμη παίρνω λάθος
	{
	printf("out of memory\n");
	exit(1);
	}
for(i = 0; i < nrows; i++)
	{
	array[i] =(int *) malloc(ncolumns * sizeof(int));////φτιάχνω τις στήλες δυναμικά για κάθε γραμμή
	if(array[i] == NULL)//αν δεν φτάνει η μνήμη παίρνω λάθος
		{
		printf("out of memory\n");
		exit(1);
		}
	}
	
all2(array,nrows,ncolumns);//κάνει όλα τα στοιχεία του πίνακα ίσα με 2
printarray(array,nrows,ncolumns);//τυπώνει τον πίνακα
for (int i=0;i<nrows;i++)
   free(array[i]);//αποδεσμεύει την μνήμη
free(array);//αποδεσμεύει την μνήμη
return 0;
}

Δημοσ.

Επίσης κάτι τέτοιο:

(Αν δεν καταλαβαίνεις ότι αλλάζουν τα περιεχόμενα του πίνακα.)

 

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

int **all2(int **, int, int);

int **all2(int **array, int nrows, int ncolumns){
int i, j;
for(i = 0; i < nrows; i++){
	for(j = 0; j < ncolumns; j++)
		array[i][j] = 2;
}
       return array;
}

main()
{
     int **array;
     int i,nrows=10,ncolumns=2;
     
     array = (int **)malloc(nrows * sizeof(int *));
     array = all2(array,nrows,ncolums);
}

Δημοσ.
Επίσης κάτι τέτοιο:

(Αν δεν καταλαβαίνεις ότι αλλάζουν τα περιεχόμενα του πίνακα.)

 

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

int **all2(int **, int, int);

int **all2(int **array, int nrows, int ncolumns){
int i, j;
for(i = 0; i < nrows; i++){
	for(j = 0; j < ncolumns; j++)
		array[i][j] = 2;
}
       return array;
}

main()
{
     int **array;
     int i,nrows=10,ncolumns=2;
     
     array = (int **)malloc(nrows * sizeof(int *));
     array = all2(array,nrows,ncolums);
}

 

είναι τελείως λάθος!!!

Δημοσ.

Οταν λες δισδιαστατο να ξερεις οτι πρακτικα ειναι μονοδιαστατο, και δευτερο και πολυ σημαντικο, ο δεικτης δεν ειναι πινακας, ειναι μια μεταβλητη (πως λεμε Int char etc.. ο δεικτης ειναι void* )

 

Επισης εκει που λες "να τον επιστρεψω στην main()" οταν εχεις να κανεις με δεικτες δεν υπαρχει λογος επιστροφης, γιατι απλα γραφεις/διαβαζεις απευθειας απο την μνημη.

Πιο απλα, ας πουμε οτι το προγραμμα σου το τρεχεις σε 32bit sys οπου ο δεικτης θα ειναι 4 byte η καλυτερα ενα int, αρα το void* μπορεις να το αντικαταστησεις με int. Εσυ θελεις μια συναρτηση η οποια θα περνει ενα "πινακα" και θα γραψει πανου του το γραμμα "A".

>#include <stdlib.h>

void work(int p)
{
*(char*)p='A';
}
int main()
{
int ptr = (int)malloc(1);
work(ptr);
printf("%c",*(char*)ptr);

free((void*)ptr);
getchar();

return 0;
}

βλεπεις, καμια επιστροφη.

 

@ npapak

Κανε κανα debug. "array[j] = 2;" μπαμ κανει οτι θα βαρεσει εδω

Δημοσ.

Ευχαριστω παρα πολυ για ολες τις απαντησεις,τα καταλαβα ολα,και παλι ευχαριστω!

Δημοσ.

Όντως λείπει κάτι:

 

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

int **all2(int **, int, int);

int **all2(int **array, int nrows, int ncolumns){
int i, j;
for(i = 0; i < nrows; i++){
	for(j = 0; j < ncolumns; j++)
		array[i][j] = 2;
}
       return array;
}

main()
{
     int **array;
     int i,j,nrows=10,ncolumns=2;
     
     array = (int **)malloc(nrows * sizeof(int *));
     for(i=0;i<nrows;i++)
     {
          array[i] = (int*)malloc(ncolumns * sizeof(int));
     }  
     array = all2(array,nrows,ncolums);
}

 

ή

 

 

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

int **all2(int **, int, int);

int **all2(int **array, int nrows, int ncolumns){
int i, j;
for(i = 0; i < nrows; i++){
               array[i] = (int*)malloc(ncolumns * sizeof(int));
	for(j = 0; j < ncolumns; j++)
		array[i][j] = 2;
}
       return array;
}

main()
{
     int **array;
     int i,nrows=10,ncolumns=2;
     
     array = (int **)malloc(nrows * sizeof(int *));
     array = all2(array,nrows,ncolums);
}

 

Είχα ξεχάσει να δημιουργήσω τον δεύτερο pointer.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...