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

Δείκτης σε δείκτη - C++ .


pbp

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

Δημοσ.

Γεια σας,

Μήπως μπορεί κανείς να μου εξηγήσει τη διαφορά ανάμεσα στις συναρτήσεις swap1 kai swap2 παρακάτω ?

 

>#include<iostream>
using namespace std;

void swap1(int **a,int **
{
    int *t;
    t=*a;
    *a=*b;
    *b=t;
}

void swap2(int *a,int *
{
    int *t;
    t=a;
    a=b;
    b=t;
}

main()
{
     int *a,*b,A=5,B=10;
     a=&A;
     b=&B;
     cout<<A<<" "<<B<<endl;
     cout<<*a<<" "<<*b<<endl;
     swap1(&a,&;
     cout<<*a<<" "<<*b<<endl;
     cout<<A<<" "<<B<<endl;
     swap2(a,;
     cout<<*a<<" "<<*b<<endl;
     cout<<A<<" "<<B<<endl;
     system("PAUSE");
}

 

Οι συναρτήσεις κάνουν ακριβώς το ίδιο πράγμα αλλά το κάνουν με ίδιο ή διαφορετικό τρόπο ?

Ευχαριστώ.

 

to B Κάντε το b στα ορίσματα και στο swap2 στη main().

Δεν ξέρω γιατί τα δείχνει κεφαλαία... Εγώ μικρά τα είχα γράψει και δεν διορθώνονται...

Δημοσ.

Στο συγκεκριμένο παράδειγμα το ίδιο πράγμα κάνουν, αλλά με διαφορετικό τρόπο. Η διαφορά είναι πως η swap1 μπορεί να σου εναλλάξει και δείκτες που δείχνουν στην αρχή 2 πινάκων από int, ενώ η swap2 όχι (αυτή εναλλάσσει τις τιμές απλών μεταβλητών τύπου int).

Δημοσ.

Στο συγκεκριμένο παράδειγμα το ίδιο πράγμα κάνουν, αλλά με διαφορετικό τρόπο. Η διαφορά είναι πως η swap1 μπορεί να σου εναλλάξει και δείκτες που δείχνουν στην αρχή 2 πινάκων από int, ενώ η swap2 όχι (αυτή εναλλάσσει τις τιμές απλών μεταβλητών τύπου int).

 

Δηλαδή για να καταλάβω...

Οι δύο τρόποι έχουν διαφορά μόνο όταν δουλεύω με πίνακες ?

Δημοσ.

Συνήθως ναι. Στο παρακάτω παράδειγμα η swap2 δεν εναλλάσσει τους p1, p2 ενώ η swap1 το κάνει...

 

>
#include<stdio.h>

// ------------------------------------------------------------------------------
void swap1(int **pp1,int **pp2)
{
    int *t;
    t = *pp1;
    *pp1 = *pp2;
    *pp2 = t;
}

// ------------------------------------------------------------------------------
void swap2(int *p1, int *p2)
{
    int *t;
    t = p1;
    p1 = p2;
    p2 = t;
}

// ------------------------------------------------------------------------------
void print_array( int *arr, const int max )
{
register int i;

for (i=0; i < max; i++)
	printf("%d ", arr[i]);
putchar('\n');

return;
}
// ------------------------------------------------------------------------------
int main(void)
{
int arr1[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int arr2[10] = { 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };
int *p1 = arr1;
int *p2 = arr2;

print_array(p1, 10);
print_array(p2, 10);

swap1( &p1, &p2 );
print_array(p1, 10);
print_array(p2, 10);

swap2(p1, p2);
print_array(p1, 10);
print_array(p2, 10);

fflush(stdin); getchar();
return 0;
}

 

EDIT1: όντως κάποια b τα κάνει B το φόρουμ.

EDIT2: άλλαξα στον κώδικα τα ονόματα των μεταβλητών

EDIT3: έσβησα μια εναλλακτική main() που μάλλον θα σε μπέρδευε χειρότερα

 

Για να στο πω με πιο απλά λόγια, η swap1 εναλλάσσει δείκτες, ενώ η swap2 απλές μεταβλητές.

Δημοσ.

Συνήθως ναι. Στο παρακάτω παράδειγμα η swap2 δεν εναλλάσσει τους p1, p2 ενώ η swap1 το κάνει...

 

>
#include<stdio.h>

// ------------------------------------------------------------------------------
void swap1(int **pp1,int **pp2)
{
    int *t;
    t = *pp1;
    *pp1 = *pp2;
    *pp2 = t;
}

// ------------------------------------------------------------------------------
void swap2(int *p1, int *p2)
{
    int *t;
    t = p1;
    p1 = p2;
    p2 = t;
}

// ------------------------------------------------------------------------------
void print_array( int *arr, const int max )
{
register int i;

for (i=0; i < max; i++)
	printf("%d ", arr[i]);
putchar('\n');

return;
}
// ------------------------------------------------------------------------------
int main(void)
{
int arr1[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int arr2[10] = { 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };
int *p1 = arr1;
int *p2 = arr2;

print_array(p1, 10);
print_array(p2, 10);

swap1( &p1, &p2 );
print_array(p1, 10);
print_array(p2, 10);

swap2(p1, p2);
print_array(p1, 10);
print_array(p2, 10);

fflush(stdin); getchar();
return 0;
}

 

EDIT1: όντως κάποια b τα κάνει B το φόρουμ.

EDIT2: άλλαξα στον κώδικα τα ονόματα των μεταβλητών

EDIT3: έσβησα μια εναλλακτική main() που μάλλον θα σε μπέρδευε χειρότερα

 

Για να στο πω με πιο απλά λόγια, η swap1 εναλλάσσει δείκτες, ενώ η swap2 απλές μεταβλητές.

 

Σε ευχαριστώ πάρα πολύ φίλε μου!

Να σαι καλά :)

Δημοσ.

Όπα!

παρατήρησα το σύμφωνα με το παράδειγμα σου το δικό μου καλύτερα και ανακάλυψα το εξής:

>#include<iostream>
using namespace std;

void swap1(int **a,int **
{
    int *t;
    t=*a;
    *a=*b;
    *b=t;
}

void swap2(int *a,int *
{
    int *t;
    t=a;
    a=b;
    b=t;
}

main()
{
     int *a,*b,A=5,B=10;
     a=&A;
     b=&B;
     cout<<A<<" "<<B<<endl;
     cout<<*a<<" "<<*b<<endl;
     //swap1(&a,&; (!)(!)(!)(!)(!)(!)(!)(!)(!)(!)(!)(!)(!)(!)(!)(!)(!)(!)(!)(!)(!)(!)(!)(!)(!)
     cout<<*a<<" "<<*b<<endl;
     cout<<A<<" "<<B<<endl;
     swap2(a,;
     cout<<*a<<" "<<*b<<endl;
     cout<<A<<" "<<B<<endl;
     system("PAUSE");
}

 

H swap2 δεν λειτουργεί ούτε εδώ...

Το θέμα είναι γιατί?

Είναι τελείως λάθος ο τρόπος ??

 

*** Συνέβει πάλι το ίδιο με το Β κεφαλαίο για ανεξήγητους λόγους. SORRY!

 

Αυτό το παράδειγμα που έκανα το έκανα για να κατανοήσω μια διαφάνεια του καθηγητή μου.

Δείτε...

 

Έστω ότι Υλοποιούμε μία δομή στοίβας με απλά συνδεδεμένες λίστες.

Η συνάρτηση push() είναι:

>
//push() χωρίς καθολικές μεταβλητές
struct person
{
char name[10];
int age;
struct person *next;
};
int push (char nname[10], int nage, struct person **head) //(!)
{
struct person *data;
data=(struct person *) malloc(sizeof(struct person));
if (data==NULL)
return 0;    
data->age=nage;
strcpy(data->name,nname);
data->next=*head;
*head=data;
}
int main(void)
{    
struct person *stack=NULL,*k;
push("Dimitris",31,&stack);  //(!)

 

ενώ η συνάρτηση gettop() ειναι:

>
//gettop() χωρίς καθολικές μεταβλητές
struct person
{
char name[10];
int age;
struct person *next;
};
int gettop(struct person *head, struct person *p) //(!)
{
if (*head==NULL)
return 0;    
p->age=head->age;
strcpy(p->name,head->name);
return 1;
}
int main(void)
{    
struct person *stack=NULL,k;
…
gettop(stack,&k); //(!)  
printf("%s, %d\n",k->name,k->age);

 

Παρατηρήστε πως περνάει στη συνάρτηση την πρώτη φορά το head & πως στην δεύτερη...

Το πρώτο μου φαίνεται απόλυτα λογικό αλλά το δεύτερο το χάνω :(

 

Ειδικά εκείνο το if(*head==NULL) στη συνάρτηση gettop(); δεν μου κάθετε καθόλου ...

Δεν υφίσταται αυτό το πράγμα ¨/

Δημοσ.

Είμαι πολύ κουρασμένος τώρα για να το δω. Αν δεν με προλάβει άλλο παιδί, θα το κοιτάξω αύριο διεξοδικά. Πες μου κάτι όμως, τον κώδικα των swap1 και swap2 τον έγραψες εσύ ή σας τον έδωσε ο καθηγητής;

 

Μήπως η swap2 πρέπει να είναι έτσι...

>
void swap2(int *p1, int *p2)
{
    int t;
    t = *p1;
    *p1 = *p2;
    *p2 = t;
}

 

Όπως και να έχει, αυτό που ρωτάς για τις στοίβες, το struct person **head είναι pass by reference του δείκτη head μέσα στην συνάρτηση push, ενώ το struct person *head είναι pass by value του δείκτη head μέσα στη συνάρτηση gettop().

 

Συμπτωματικά είχα μια παρόμοια συζήτηση σήμερα το μεσημέρι, σε άλλο φόρουμ. Νομίζω θα σε βοηθήσει: http://forum.ubuntu-gr.org/viewtopic.php?p=194525#p194525 (ειδικά ο κώδικας στο τέλος εκείνου του ποστ)

Δημοσ.

Είμαι πολύ κουρασμένος τώρα για να το δω. Αν δεν με προλάβει άλλο παιδί, θα το κοιτάξω αύριο διεξοδικά. Πες μου κάτι όμως, τον κώδικα των swap1 και swap2 τον έγραψες εσύ ή σας τον έδωσε ο καθηγητής;

 

Μήπως η swap2 πρέπει να είναι έτσι...

>
void swap2(int *p1, int *p2)
{
    int t;
    t = *p1;
    *p1 = *p2;
    *p2 = t;
}

 

Όπως και να έχει, αυτό που ρωτάς για τις στοίβες, το struct person **head είναι pass by reference του δείκτη head μέσα στην συνάρτηση push, ενώ το struct person *head είναι pass by value του δείκτη head μέσα στη συνάρτηση gettop().

 

Συμπτωματικά είχα μια παρόμοια συζήτηση σήμερα το μεσημέρι, σε άλλο φόρουμ. Νομίζω θα σε βοηθήσει: http://forum.ubuntu-gr.org/viewtopic.php?p=194525#p194525 (ειδικά ο κώδικας στο τέλος εκείνου του ποστ)

 

Όχι αυτό με το swap το εφτιαξα μόνος μου γιατί επηρεάστηκα από αυτό με τις στοίβες (και είναι λάθος το swap2)(sry για αυτο)...

Μπορείς να δεις αύριο σε παρακαλώ αυτό με το if(*head==NULL) που αναφέρω στο τέλος γιατί αυτό μου τα χαλάει πιο πολύ και πιστεύω πως το έχει λάθος ο καθηγητής?

Πάω να κοιτάξω το λινκ που μου έστειλες ...

Σε ευχαριστώ για το χρόνο σου!

θα περιμένω απάντηση αυριο :)

Καλή σου νύχτα!

Δημοσ.

Δεν το χει λάθος ο καθηγητής, σωστά το έχει... περνάει τον δείκτη head by reference στην push()... δες το link και τα λέμε από αύριο πάλι, που θα έχω καθαρό μυαλό γιατί τώρα έχει γίνει... ζουμί :lol:

 

ΥΓ. Α, οκ για τη swap2... οπότε ο σωστός της κώδικας είναι αυτός που οου έγραψα τώρα στο τέλος.

 

Καλά, ότι να 'ναι γράφω (καλά λέω έχει γίνει ζουμί το μυαλό μου :lol:). Όντως, το: if ( *head == NULL ) στην gettop() είναι άκυρο, αφού το όρισμα head το έχει δηλωμένο ως μονό pointer... if ( head == NULL ) έπρεπε να είναι.

Δημοσ.

Καλημέρα,

 

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

 

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

struct person {
char name[10];
int age;
struct person *next;
};

// ------------------------------------------------------------------------------
int push (char nname[10], int nage, struct person **head) //(!)
{
struct person *p;
p = (struct person *) malloc( sizeof(struct person) );
if ( p == NULL )
	return 0;
   
p->age = nage;
strcpy(p->name, nname);
p->next = *head;
*head = p;

return 1;
}

// ------------------------------------------------------------------------------
int gettop(struct person *head, struct person *p) //(!)
{
if (head == NULL)
	return 0;    

p->age = head->age;
strcpy( p->name, head->name);

return 1;
}

// ------------------------------------------------------------------------------
void stack_destroy( struct person **stack)
{
// Εδώ κάνε free() όλους τους κόμβους της stack

return;
}

// ------------------------------------------------------------------------------
int main(void)
{
int success = 0;
struct person k, *stack = NULL;

success = push("Dimitris", 31, &stack);  //(!)
if ( success )
{
	success = gettop( stack, &k );
	if ( success )
		printf("TOS: name = %s, age = %d\n", k.name, k.age);
	else
		puts("gettop() failed");
}
else
	puts("push() failed");

/*
 * ΣΗΜΑΝΤΙΚΟ:
 * Πριν τερματίσεις το πρόγραμμά σου γράψε μια συνάρτηση που θα κάνει free()
 * ΟΛΟΥΣ ΤΟΥΣ ΚΟΜΒΟΥΣ της stack!
 */

fflush(stdin); getchar();
return 0;
}

 

Τον κώδικα της stack_destroy() που θα κάνει free στο τέλος όλους τους κόμβους της στοίβας πρόσθεσέ τον εσύ ;)

Δημοσ.

Καλημέρα,

 

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

 

Σε ευχαριστώ πολύ!

να σαι καλα :)

Τα κατάλαβα

Δημοσ.

Τέλος καλό, όλα καλά. Οπότε τώρα η αρχική μου απάντηση και λάθος έχει την swap2 και αντίκρισμα δεν έχει, αλλά βαριέεεεεεεεεεεεεεεμαι να τη διορθώσω τώρα :lol:

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

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

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