数组指针类型与函数指针类型
2019-10-02 12:10:46
本文总阅读量

由于数组类型与函数类型的定义方法很类似,因此放到一起。

数组指针
数组类型的定义
1
2
3
4
5
6
7
8
9
10
typedef int (myArrayType)[10];
int main()
{
int a[10];
myArrayType b;//等价于int b[10];
a[0] = 1;
b[0] = 1;
cout << a[0] << " " << b[0] << endl;
return 0;
}
输出结果:
数组指针类型的定义
1
2
3
4
5
6
7
8
9
10
typedef int(*myPArrayType)[10];
int main()
{
int a[10];
a[0] = 1;
myPArrayType p;
p = &a;
cout << (*p)[0] << endl;
return 0;
}
输出结果:

myPArrayType是数组的地址,而a是数组首元素的地址,因此myPArrayType相当于一个二级指针。

说到数组指针就不得不提一下指针数组,初学指针与数组时很容易混淆这两个概念,但其实也很好理解。数组指针可以念成数组的指针,也就是说本质上是一个指针,只是该指针指向的是一个数组罢了,也就是上面这个例子。而指针数组又可以念成指针的数组,顾名思义本质上是一个数组,只不过数组的元素是指针。

另外值得注意的是a+1&a+1完全不同,指针+1的步长取决于指针所指的数据类型,a指的是int类型因此向后移动四个字节,而&a指向的是一个数组因此向后移动四十个字节。

函数指针
通过函数类型定义函数指针
1
2
3
4
5
6
7
8
9
typedef int (myFuncType)(int);
int main()
{
int a = 5;
myFuncType *Func;
Func = &add;
cout << Func(a) << endl;
return 0;
}
输出结果:
直接定义函数指针类型
1
2
3
4
5
6
7
8
9
10
typedef int (*myPFuncType)(int);
int main()
{
int a = 5;
myPFuncType Func;
//Func = &add; //加不加取地址号都可以 为什么呢??????
Func = add;
cout << Func(a) << endl;
return 0;
}
输出结果: