C语言问题!!!请问大佬为什么这种情况他提示数组的下标不同却还可以运行

#include <stdio.h>
char func1() 
{
    return 'a';
}
char func2() 
{
    return 'b';
}
char func3() 
{    return 'c';
}
char (*xarr[])()={func1,func2,func3};//xarr是一个数组
//这个数组有3个指向函数的指针,指针所指(返回)数据类型为字符型。
char (*((*x())[]))()
{
    return &xarr;
}
int main()
{
    printf("%c\n",((*(x()))[0])());//x是一个函数
    //这个函数返回值为指针,这个指针指向数组中的第一个元素
    //这个元素的返回值为这第一个函数的返回值
    return 0;
}

具体图片如下

 

#include <iostream>
#include <stdio.h>
char func1()
{
	return 'a';
}
char func2()
{
	return 'b';
}
char func3()
{
	return 'c';
}
char (*xarr[])() = { func1,func2,func3 };//xarr是一个数组
//这个数组有3个指向函数的指针,指针所指(返回)数据类型为字符型。
/*
char (*((*x())[]))()
{
	return &xarr;
}*/
int main()
{
	printf("%c\n", (xarr[0])());//x是一个函数
	//这个函数返回值为指针,这个指针指向数组中的第一个元素
	//这个元素的返回值为这第一个函数的返回值

	system("pause");
	return 0;
}

那个x函数返回值不是报错了么

还有就是为什么不直接调用。。。

 

这不是警告么,可以运行。显式类型不一致,但可以隐式转换,所以还是可以运行的。

就比如你把 int*传递给char*,都是指针,可以隐式转换,但类型不一致,给你个提醒

typedef char (*FP[3])();
FP& x()
{
	return xarr;
}

int main()
{
	printf("%c\n", (x()[0])());//x是一个函数
	//这个函数返回值为指针,这个指针指向数组中的第一个元素
	//这个元素的返回值为这第一个函数的返回值

	system("pause");
	return 0;
}

用typedef吧,那代码看着头疼

希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10581430.html