C++初学者很容易被这几个概念弄混,简而言之:
指针数组:是一个数组,数组内元素为指针
数组指针:是一个指针,指向一个数组
指针函数:是一个函数,函数返回值为一个指针
函数指针:是一个指针,指向一个函数
下面我们再看看具体定义与内容:
1、指针数组
int arr_value[3];
int *arr_p;
int *arr[3];
我们知道第一行第二行代码分别是定义数组与指针,那第三行是是定义啥?这就涉及到C++中运算符优先级的问题了,arr先与[]结合那它就是数组,arr先与*结合那它就是指针。在这里[]的优先级要高于*,因此首先定义变量名arr其为大小为3的一个数组,再定义数组里元素int*。
下面是指针数组的定义与赋值:
int *arr[3];
int value[3] = { 1,2,3 };
for (int i = 0; i < 3; i++)
{
arr[i] = &value[i]; //将数组value每个元素的地址赋值给arr[i]
}
for (int i = 0; i < 3; i++)
{
cout<<arr[i]<<"\t"<<*arr[i]<<endl;
}
2、数组指针
int (*arr_p)[3];
前面我们知道,一个变量到底是指针还是数组主要看[]与*谁先与他结合,在这里*先与arr_p结合因此arr_p是一个指针,那它指向的是啥,它指向的是一个大小为3的数组,数组里面元素为int。
下面是数组指针定义与赋值:
int(*arr_p)[3];
int arr_value[3] = { 1,2,3 };
arr_p = &arr_value; //把数组arr_value当成一个整体,将变量arr_value的地址赋值给一个指针
for (int i = 0; i < 3; i++)
{
cout<<(*arr_p)[i]<<endl; //这里(*arr_p)解指针获得变量arr_value
}
3、指针函数
int* func(){
}
这就比较好理解了,简单来说就是定义一个函数func,其返回值类型为int*。
4、函数指针
int (*func_p)(int);
怎么理解这段代码呢?我们首先看到的是(*func_p),说明func_p是一个指针,再看(int ),说明指针func_p它指向的是一个函数,函数输入参数的类型为int ,最后看左侧int 说明其func_p指向函数的返回值类型为int。
下面看看函数指针如何使用:
//定义函数
int func_1(int i){
return 1*i;
}
int func_2(int i){
return 2*i;
}
int main()
{
int num=10;
int (*func_p)(int); //定义一个函数指针
func_p=func_1; //函数指针func_p指向函数func_1
cout<<"func_1:"<<(*func_p)(num)<<endl;// 解指针获得指向的函数
func_p=func_2; //函数指针func_p指向函数func_2
cout<<"func_2:"<<(*func_p)(num)<<endl;
system("pause");
return 0;
}