我需要一个一个地初始化函数指针吗?

3

当我像下面这样在一次初始化函数指针时,它不起作用。

ptr[3]={add, subtract, multiply};

这会产生以下结果:

[错误] 在 '{' 标记之前需要表达式

然而,逐个初始化可以正常工作。为什么会这样呢?

//array of function pointers

#include<stdio.h>

void add(int a, int b){
    printf("%d\n", a+b);
}


void subtract(int a, int b){
    printf("%d\n", a-b);
}


void multiply(int a, int b){
    printf("%d\n", a*b);
}


int main(){
    
    void (*ptr[3])(int, int);
    
    
    //ptr[3]={add, subtract, multiply};  this initialization does not work
    
    //but this works
    ptr[0]=add;
    ptr[1]=subtract;
    ptr[2]=multiply;
    
    ptr[2](3,5); //15
    
}

2
ptr[3] 是越界访问。然后你试图将一个列表分配给它,而 ptr[i] 是一个单一指针。这不是初始化(因为你要从声明中分开做),也与函数指针无关(使用 int 数组会得到相同的错误)。 - HolyBlackCat
1
void (*ptr[3])(int, int) = {add, subtract, multiply}; 这样的初始化应该可以工作。 - Gaurav Pathak
我可以将函数指针的声明和赋值放在不同的行中吗?@HolyBlackCat - Lyrk
1
只有你这样做,通过单独为每个元素分配来完成。 - HolyBlackCat
2个回答

2
在这个任务中,ptr[3]={add, subtract, multiply};右侧是一个适合初始化三个函数指针数组的合适的初始化列表。然而,左侧(ptr[3])是错误的:那只是一个数组的单个元素,而且还越界了。
只需在声明中进行“赋值”,并将其初始化即可:
int main(void)
{
    void (*ptr[3])(int, int) = {add, subtract, multiply}; // this initialization does work
    ptr[2](3, 5); //15
}

实际上,与您的数组元素是函数指针没有什么特别之处。任何数组都不能通过“整体赋值”(使用=运算符)在其声明之外的任何时候被赋值。在变量声明中,=标记的使用不是正式的赋值操作,而是初始化操作。有用的阅读材料: C语言中的初始化与赋值


但是当我初始化一个整数数组时,我可以这样做 int arr[3]={4,6,7}; 我的意思是这不是第三个元素,我正在声明一个由3个整数组成的数组。我并不是在尝试分配第三个元素。 - Lyrk
1
@Lyrk 是的,但你不能这样做 int arr[3]; 然后,在一个单独的语句中执行 arr[3] = {4,6,7};。事实上,数组只能在声明时使用这种列表进行初始化。 - Adrian Mole

1

在声明过程中需要进行初始化。

//array of function pointers

#include<stdio.h>

void add(int a, int b){
    printf("%d\n", a+b);
}


void subtract(int a, int b){
    printf("%d\n", a-b);
}


void multiply(int a, int b){
    printf("%d\n", a*b);
}


int main(){
    
    void (*ptr[3])(int, int) = {add, subtract, multiply};
    
    ptr[2](4,5); //20
    
}

你需要在声明时进行初始化。这只适用于函数指针吗?因为我可以在其他指针变量中将声明和赋值分开成两行。 - Lyrk
1
@Lyrk 在单独的一行中这是一个赋值而不是初始化。对于数组来说,这个区别主要很重要,因为无法在一行中整体赋值。 - HolyBlackCat
1
非常感谢。C语言让人无从下手。@HolyBlackCat - Lyrk
1
@Lyrk 等你学到 C++ 的时候,会更难哦。D: - HolyBlackCat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接