Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 返回指向函数错误的指针_C_Unix_Pointers_Function Pointers - Fatal编程技术网

C 返回指向函数错误的指针

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

我被要求编写一个代码,用指针将3个输入的整数重新排列成升序/降序

我需要使用函数
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)
的副本/过去,我忘了删除它。我更正了答案,可能会更清楚。