函数指针数组为何无法一次性初始化,仅逐个赋值可行?
函数指针数组初始化报错原因解析
你遇到的问题本质是C语言对数组赋值的语法规则限制:
核心原因
C语言里,用{}的集合初始化语法只能在数组变量声明的同时使用,不能在声明完成后单独用{}给整个数组赋值。
你写的ptr[3]={add, subtract, multiply};属于声明后的赋值操作,这种写法不符合C语言语法,编译器会认为{前面缺少合法表达式,所以抛出expected expression before '{' token错误。
而逐个赋值ptr[0]=add; ptr[1]=subtract; ptr[2]=multiply;是合法的,因为数组的单个元素是可修改的左值,直接给每个元素赋值是被允许的。
正确的初始化写法
如果想一次性完成数组的初始化,应该在声明数组的同时就用{}赋值:
//函数指针数组 #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](3,5); // 输出15 }
补充说明
数组名ptr本质是一个指向数组首元素的指针常量,不能被直接赋值(比如不能写ptr = {xxx}),但数组的每个元素是独立的可修改对象,所以逐个赋值是完全合规的操作。
内容的提问来源于stack exchange,提问作者Lyrk
相关产品推荐
相关产品推荐

