本文想讲解一下如下几个比较容易混淆的概念,希望让其好理解。
1、指针函数、函数指针
2、指针数组、数组指针
3、函数模板、模板函数
4、类模板、模板类
5、指针常量、常量指针。
首先我们先讲解第1和第2两个概念,这两个概念是可以放到一起去考虑的。指针函数和指针数组的这个概念比较简单,其实就是返回值和数组里面的内容是指针,这个概念不容易混淆。记住它们的声明方式都是char *就行,也可以理解成(char *),因为这本来就是一个类型。遗留的问题是目前好像指针函数这种使用方式确实比较少,工作中没怎么使用过。
再来说说函数指针和数组指针,这个两个从字面上的意思是都是一种类型的指针。只不过我们比较常见的指针是指向变量的,它的样子是char *a = c; 简化一下就是 *a = c; 指向一个函数的或者是一个数组的不怎么常见。比如一个函数,最简单的声明是 char fun(char a, char b); 类比刚刚说的变量的指针,肯定是(*p_fun) = fun,所以完全的函数指针应该是 char (*p_fun)(char a, char b) = fun。再简化一下就是char (*p_fun)(char ,char)这样一个函数指针就写出来了。类比数组指针也是这个思维方式。另外我们使用函数指针一般的方式都是在前面加上一个typedef。这样基本就可以直接使用使用了,就想这样 typedef char (*p_fun)(char a, char b); p_fun = fun;
下面说说3和4两个概念,这两个也是后面C++相当于C之后一个很大的改进。在后面面向多态中使用了很多,也可以有很多的扩展。其实简单的理解就是,也是一个类型。但是这个类型是什么我先不说,等到后面使用的时候再说。这个底层的实现机制是可以探究一下的,有利于理解C++的实现逻辑。估计就是哈java的反射机制有点像的那种。我这边理解为,写下了template之后,就是“大家都闪开,我要开始装B了”。然后再写typename,告诉大家“template就是这么装B的”。
最后说说第5个的概念,这两个概念其实中文不好理解。以char *a为例子,我认为可以这么理解const在*的后面,那么const只修饰变量,所以变a的值不能变。但是*a的值可以变。如果const在*的前面,那么*a的值不能变,a可以变。
这些知识点都是比较浅显的一些知识点,是我自己的一些理解,如果有不对的地方,欢迎指正。
好了,今天就到这里吧。