复杂类型的确定这一系列博客写到这章应该算是告一段落了。这几章所写的还是一些理论性的东西以后在实践中遇到了再拿实例出来写了。
1、我们先来看看二级指针。
对于 int a=5;int *p=&a; *p=6;这一小段代码我们都是已经非常熟悉了;定义了一个指针p;并使该指针指向a;最后通过指针来改变a的值。
那么对于 int **p;呢?
我们先来看看 int**p;究竟是个什么东西吧。
变量p离*最近,我们可以确定p是一个指针;将*p看成一个整体得到 int *A ,A还是离*最近,那么指针p应该是指向另一个指针,再将*A 看成一个整体
得到 int B,我们就知道该指针指向一个整型变量。
最后我们确定 int **p;中的p是一个指向一个整型变量的指针的指针(读起来好拗口),拆开来写吧:p是一个指向另一个指针(该指针指向了一个整型变量)的指针。
来个小例子吧:
int _tmain(int argc, _TCHAR* argv[]) { int **p; int *q; int a=0; int b=3 ; q=&a; p=&q; printf("%d\n",*q); *p=&b; printf("%d\n",*q); return 0; }
结果:
可以看出我们通过二级指针p改变了指针q的指向。
2、函数的返回类型
对于像 int func(), int func(int x ,int y),等等的函数我们已经相当的了解了。那么我们是如何来确定一个函数的返回类型的呢?
其是跟确定指针的指向是非常类似的,让我们一起先来看一个简单的吧。
对于int func(int x,int y)
a、func离()最近,我们可以确定 func是一个函数。该函数有两个int类型的形参。
b 将func和他的参数列表看成一个整体的int A,剩下的就是他的返回类型,可知该函数返回值是int类型。
ok,在来个跟上面列子有点相似的。 int (* func)(int x,int y)
一样走起:
a、func离*最近,所以func应该是一个指针。
b、将*func看成一个整体得到 int A(int x,int y),呵呵,是不是又变成有上面的列子了。
c、func是一个指向一个形参为两个int类型,返回值为int类型的函数的指针。这种指针我们称之为函数指针(即指向一个函数的指针)。
贴一个小例子出来:
int func(int x,int y){ return x+y; } int _tmain(int argc, _TCHAR* argv[]) { int (*p)(int,int); //声明函数指针 p=func; //将指针指向func函数 printf("%d\n",p(3,5)); //通过函数指针调用func函数 return 0; }
结果:
ok,来个复杂点的。int (*func(int x,int y)[5];
还是一样的步骤:
a、func离()最近,确定func是一个函数,该函数有两个int 类型的形参。
b、将func和形参列表看成一个整体得到 int(* A)[5];到这里就明了了,该函数返回的是一个指向 int[][5]数组的指针(即返回的是一个数组指针)。
为什么这么说,可以看看http://www.cnblogs.com/showCode/p/3632394.html,在这里不写原因了。