Δημοσιεύτηκε: 08 Φεβ 2012, 12:04
από migf1
Καλημέρα, ναι μπορείς να χρησιμοποιήσεις την αποαναφορά του δείκτη της συνάρτησης ως την τιμή επιστροφής της συνάρτησης στην οποία δείχνει. Με μικρές αλλαγές, ο κώδικας που παραθέτεις γίνεται...

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

#include <stdio.h>

/* ------------------------------------------- */
int func( int sum )
{
int a, b;

printf("Give a number: ");
scanf("%d" , &a);

printf("Give a number: ");
scanf("%d", &b);

sum = a + b ;
return sum;
}

/* ------------------------------------------- */
int main( void )
{
int sum = 0;
int (*pf)(int sum) = &func ;

printf("%d\n", (*pf)(sum) );
printf("%p %p\n", pf, &func );

return 0;
}


Ειδικά για τους δείκτες σε συναρτήσεις (και μόνο για αυτούς) μπορείς να τους απο-αναφέρεις χωρίς να χρησιμοποιείς αστερίσκο, δηλαδή αντί για...

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

printf("%d\n", (*pf)(sum) );

μπορείς να γράψεις...

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

printf("%d\n", pf(sum) );

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

Άσχετα με τους δείκτες, η χρήση του sum στην func() είναι περιττή (εκτός αν αλλάξεις το πέρασμα του sum από by-value σε by-reference, ώστε να έχει κάποιο νόημα η χρήση του στη συνάρτηση (π.χ. να κρατάει το άθροισμα των αριθμών και μετά το πέρας της συνάρτησης). Τώρα που το περνάς by-value είναι τελείως περιττό στην func(), οπότε ο κώδικας μπορεί να γραφτεί...

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

#include <stdio.h>

/* ------------------------------------------- */
int func( void )
{
int a, b;

printf("Give a number: ");
scanf("%d" , &a);

printf("Give a number: ");
scanf("%d", &b);

return a+b;
}

/* ------------------------------------------- */
int main( void )
{
int sum = 0;
int (*pf)(void) = &func ;

sum = (*pf)();
printf("%d\n", sum );

printf("%p %p\n", pf, &func );

return 0;
}