是否有可能增加在C函数指针

问题描述 投票:3回答:4

我有下面的代码,我得到段错误作为我的函数指针指向函数指针的数组和函数指针的增量不函数指针数组中指向下一个元素之后。

int f2(int);
int f1(int);
int(*fp[2])(int) = {f1,f2};

int f1(int x)
{
return (x+10);
}


int f2(int y)
{
return (y+20);
}

int main() {
    int sum = 0;
    int (*fp1) (int);

    fp1 = fp;
    printf("addr of fp1 is %x\n",fp1);
    ++(fp1);
    printf("after increment addr of fp1 is %x\n",fp1);
    sum = (*fp1)(sum);
        printf("%d \n",sum);
        return 0;
    }

但是当我使用指针函数指针的指针,如:

INT(** FP1)(INT);然后代码工作正常。请告诉:

1,为什么只是指针功能无法正常工作。

2-函数指针即FP1做++ FP1仅当由一个递增地址。

3-当我传递FP1 = FP [0];那么它也没有与这两个指针工作,函数指针..而且还与函数指针。是FP和FP [0]在不同的地址指向?

c pointers function-pointers
4个回答
5
投票

函数指针

递增和递减运算符是无效的函数指针。

下面是来自C ++标准草案(N3337)相关的文字:

5.3.2递增和递减

1前缀++的操作数是通过将1改性,或设置为true如果是bool(这种用途已被弃用)。操作数应当被修改的左值。类型的操作数应该是一个算术类型或一个指针指向一个完全定义的对象类型。该值是操作数的新的价值;它是一个左值。如果x是类型bool的未中,表达++x相当于x+=1

给函数的类型的指针既不是算术式,也不是这样一个指针指向一个完全定义的对象类型。因此,++不能被应用到的指针的函数。

至于C被而言,C99标准(n1256)说:

6.5.3.1前缀增量和减量运算

1前缀增量或减量操作者的操作数应当有合格的或不合格的真实或指针类型,并为一个修改的左值。

2前缀++运算符的操作数的值被递增。其结果是增量后的操作数的新值。表达++ E是相当于(E + = 1)。见添加剂运营商的信息,约束,类型,副作用,和转化的讨论和化合物分配和操作上的指针的作用。

6.5.6加法运算符

2对于另外,任一两个操作数应具有算术类型,或一个操作数应的指针的对象类型和其他应具有整数类型。 (增加等效于将1)

在这里,一个指向函数不能递增出于同样的原因。

函数指针/指针的数组函数指针

该生产线

int(*fp[2])(int) = {f1,f2};

声明指针数组给函数。因此,表达fp[0]fp[1]是有效的表达式。你可以有一个指针的指针函数对象与增量操作者使用。

int (**fpp)(int) = fp;
(*fpp)(10);  // Calls f1(10)
fpp[0](10);  // Calls f1(10)
fpp[1](10);  // Calls f2(10)
++fpp;
(*fpp)(20);  // Calls f2(20)
fpp[0](20);  // Calls f2(20)

不幸的是,GCC 4.7.3允许下面的语句来编译,而G ++没有。

int(*fp[2])(int) = {f1,f2};
int (*fpp)(int) = fp;

调用

fpp(10);

导致这种情况下,不确定的行为。


3
投票

fp1被定义为int (*fp1) (int);这不是一个指向函数指针阵列。这是一个指向函数的指针。你不能增加它。

然而,你可以/应该增加的一个指针数组的元素:

int (**fp_array)(int) = fp;

fp1 = *fp_array;
printf("addr of fp1 is %x\n",fp1);
fp1 = *(++fp_array);
printf("after increment addr of fp1 is %x\n",fp1);

但在这种情况下,这是废话,为什么不干脆写:

fp1 = fp[0];
printf("addr of fp1 is %x\n",fp1);
fp1 = fp[1];
printf("after `increment` addr of fp1 is %x\n",fp1);

2
投票

我想补充给定的反应,这已经回答你的问题,我想建议你的typedef功能类型:

typedef int function(int);
function* fp[] = { &f1, &f2};
function** f = fp; // array-to-pointer decay

f现在可以增加你预期的方式。


1
投票

你尝试做的是可能的。然而,这显然是棘手的,或者你就不会在这里发布。

更简单的使用索引到数组FP。

int i = 0;
printf ("First result = %d\n", (* (fp [i++])) (10));
printf ("Second result = %d\n", (* (fp [i++])) (10));

有人读代码这样有机会找出它做什么。

© www.soinside.com 2019 - 2024. All rights reserved.