在研究函数指针时发现一些问题,贴出来与大家共享。
例如定义个函数指针:
//定义指针
void (*pFunc)();
//实例一个无参函数
void printing()
{//do something
}
pFunc = printing;
//奇怪的事情或问题来了,下面这样的调用都是正确的(VS下测试)
pFunc();
(*pFunc)();
也就是说pFunc()等于(*pFunc)()
很是无语,问度娘,QQ群里问,最终加上自己测试才得知有隐式指针(指针函数)一说,就是pFunc等于*pFunc
然后在VS下测试了几乎所有类型下的a &a *a等三种情况;
1、int 基本类型
int a = 2;
&a 获取变量a的地址;
a 获取变量a保存的内容,即整数2;
*a 错误写法;
2、int* 整数指针类型
int b = 3;
int* p = &b;
&p 获取指针变量p的地址;
p 获取指针变量p的内容,即p的本身地址;
*p 获取指针变量指向的内容,即整数3(变量b);
3、int[2][3]数组类型
int arr[2][3] = {{2,3,4},{5,6,7}};
// arr == &arr == *arr == &arr[0]
以上这几个写法得到的打印结果都是一样,即数组的首地址;
*arr[0] 只有这个写法不一样,获取数组变量arr里保存的第一个整数2;
4、函数指针类型
void printing()
{//do something
}
pFunc = printing;
pFunc();
(*pFunc)();
&pFunc 获取函数指针本身的地址;
pFunc,*pFunc 这两个打印的结果是一样的,都是获取函数指针变量pFunc保存的内容,即printing的首地址(VS下测试);
当然与字面理解上是相冲突的,一般理解是pFunc保存了一个地址,*pFunc是获取到pFunc指向地址的内容;我也郁闷啊;
最后加一句,函数名即是一种隐式函数指针;
以上内容属于个人理解和测试,欢迎大牛斧正。另外GNU下的gcc未测试,猜测结果应该是一样的。