C 返回指向函数错误的指针
我被要求编写一个代码,用指针将3个输入的整数重新排列成升序/降序 我需要使用函数C 返回指向函数错误的指针,c,unix,pointers,function-pointers,C,Unix,Pointers,Function Pointers,我被要求编写一个代码,用指针将3个输入的整数重新排列成升序/降序 我需要使用函数order()返回指向函数ascending3()或discending()的指针,具体取决于输入的“e”值 我一直在readInts()函数中指定的行中遇到错误,不知道如何修复它 错误 lvalue required as unary ‘&’ operand" -- The error for `ptr = &(order(e))` warning: assignment makes poin
order()
返回指向函数ascending3()
或discending()
的指针,具体取决于输入的“e”值
我一直在readInts()函数中指定的行中遇到错误,不知道如何修复它
错误
lvalue required as unary ‘&’ operand" -- The error for `ptr = &(order(e))`
warning: assignment makes pointer from integer without a cast -- The error for `ptr=order(e)`
指针代码
void readInts(){
int *a,*b,*c;
char e;
int (*ptr1)(int*,int*,int*);
int result;
printf("Enter Integer 1:");
scanf("%d", a);
printf("Enter Integer 2:");
scanf("%d", b);
printf("Enter Integer 3:");
scanf("%d", c);
printf("Enter either A or D:");
scanf(" %c", &e);
ptr1 = &(order(e)); /*ERROR HERE*/
result = (*ptr1)(a,b,c);
printf("%d %d %d", a, b, c);
}
功能
int ascending3(int* x, int* y, int* z)
{
/*removed sorting code for the sake of shortening the question*/
*x=smallest;
*y=middle;
*z=largest;
}
int descending(int* x, int* y, int* z)
{
int swap;
ascending3(x,y,z);
swap=*x;
*x=*z;
*z=swap;
}
int (*order(char e))(int*x ,int*y,int*z)
{
if(e=='a')
{
return ascending3;
}
else if(e =='d')
{
return descending;
}
return;
}
函数不能返回函数。因此,您不能将运算符(
&
)的地址应用于函数结果(检索地址)。但是函数可以返回指向函数的指针
C语言中函数的名称(是否由&
运算符作为前缀)始终设置为函数的地址,即指向该函数的指针
正确的代码是:
int ascending3(int *x, int *y, int *z);
int descending(int *x, int *y, int *z);
typedef int (*fn)(int *x, int *y, int *z);
fn order(char e)
{
if (e == 'a')
{
return ascending3;
}
else if (e == 'd')
{
return descending;
}
return NULL;
}
void readInts(void)
{
int *a, *b, *c;
char e;
fn ptr1;
int result;
printf("Enter Integer 1:");
scanf("%d", a);
printf("Enter Integer 2:");
scanf("%d", b);
printf("Enter Integer 3:");
scanf("%d", c);
printf("Enter either A or D:");
scanf(" %c", &e);
ptr1 = order(e);
result = (*ptr1) (a, b, c);
printf("%p %p %p", a, b, c);
}
在这里,我使用了typedef
来声明函数指针的类型(还有两个用于排序函数的原型)
如果您想用星号更好地显示我们类型的指针性质,可以将fn
定义为函数(而不是函数指针):
因此,您可以使用星号符号:
typedef int fn(int *x, int *y, int *z);
fn *order(char e)
{
if (e == 'a')
{
return ascending3;
}
else if (e == 'd')
{
return descending;
}
return NULL;
}
void readInts(void)
{
int *a, *b, *c;
char e;
fn *ptr1;
int result;
printf("Enter Integer 1:");
scanf("%d", a);
printf("Enter Integer 2:");
scanf("%d", b);
printf("Enter Integer 3:");
scanf("%d", c);
printf("Enter either A or D:");
scanf(" %c", &e);
ptr1 = order(e);
result = (*ptr1) (a, b, c);
printf("%p %p %p", a, b, c);
}
函数不能返回函数。因此,您不能将
运算符(&
)的地址应用于函数结果(检索地址)。但是函数可以返回指向函数的指针
C语言中函数的名称(是否由&
运算符作为前缀)始终设置为函数的地址,即指向该函数的指针
正确的代码是:
int ascending3(int *x, int *y, int *z);
int descending(int *x, int *y, int *z);
typedef int (*fn)(int *x, int *y, int *z);
fn order(char e)
{
if (e == 'a')
{
return ascending3;
}
else if (e == 'd')
{
return descending;
}
return NULL;
}
void readInts(void)
{
int *a, *b, *c;
char e;
fn ptr1;
int result;
printf("Enter Integer 1:");
scanf("%d", a);
printf("Enter Integer 2:");
scanf("%d", b);
printf("Enter Integer 3:");
scanf("%d", c);
printf("Enter either A or D:");
scanf(" %c", &e);
ptr1 = order(e);
result = (*ptr1) (a, b, c);
printf("%p %p %p", a, b, c);
}
在这里,我使用了typedef
来声明函数指针的类型(还有两个用于排序函数的原型)
如果您想用星号更好地显示我们类型的指针性质,可以将fn
定义为函数(而不是函数指针):
因此,您可以使用星号符号:
typedef int fn(int *x, int *y, int *z);
fn *order(char e)
{
if (e == 'a')
{
return ascending3;
}
else if (e == 'd')
{
return descending;
}
return NULL;
}
void readInts(void)
{
int *a, *b, *c;
char e;
fn *ptr1;
int result;
printf("Enter Integer 1:");
scanf("%d", a);
printf("Enter Integer 2:");
scanf("%d", b);
printf("Enter Integer 3:");
scanf("%d", c);
printf("Enter either A or D:");
scanf(" %c", &e);
ptr1 = order(e);
result = (*ptr1) (a, b, c);
printf("%p %p %p", a, b, c);
}
您是否在readInts
之前定义或声明了order
?它应该是ptr1=order(e)
,但是在readInts
中使用order
函数之前必须声明它。。。。结果=(*ptr1)(a,b,c)代码>应该是result=ptr1(a,b,c)
。可以对函数指针使用typedef
来提高可读性:typedefint(*fnptr)(int*x,int*y,int*z)代码>然后:fnptr order(char e){
@alk ohh yes没有注意到这一点。您在readInts
之前定义或声明了order
吗?它应该是ptr1=order(e)
,但是在readInts
和result=(*ptr1)(a,b,c)中使用之前必须声明order
order
函数
应该是result=ptr1(a,b,c);
你可以使用typedef
作为函数指针来增加可读性:typedef int(*fnptr)(int*x,int*y,int*z);
然后:fnptr order(chare){
@alk ohh yes没有注意到这一点。typedef int(fn)
中的(fn)
(int*x,int*y,int*z);
可能只是一个fn
。简而言之,fn
周围的括号是无用的。我觉得这样的措辞“只是因为你永远无法从函数返回函数(从哪里获取地址),但你可以交换指向函数的指针。”不清楚。@alk Yes括号是多余的,来自(*fn)
的副本/过去,我忘了删除它。我更正了答案,也许更清楚了。中的(fn)
类型定义int(fn)(int*x,int*y,int*z);
可能只是一个fn
。简而言之,fn
周围的括号是无用的。我觉得这样的措辞“只是因为你永远无法从函数返回函数(从哪里获取地址),但你可以交换指向函数的指针。”不清楚。@alk Yes括号是多余的,来自(*fn)
的副本/过去,我忘了删除它。我更正了答案,可能会更清楚。