记住英文定义,你再也不会混淆C语言的指针数组、数组指针,函数指针、指针函数

    经常有小伙伴在求职面试过程中,会被问到C语言的基础问题,最令人抓狂的两个问题可能是:1)请说出指针数组和数组指针的区别; 2)请说出函数指针和指针函数的区别。

    虽然小伙伴们有很丰富的开发经验,如果没有做好准备,突然面对这两个问题,也会大脑瞬间一懵。实际上,这些技术在项目开发中会经常使用,就是和名称没对应上。笔者最近仔细研究了下这两类问题,对比英文定义,发现根源还是我们的汉语博大精深(或者说语法不严谨),从而导致一堆绕口令式的“专业术语”,绕来绕去将人绕晕。

    1)指针数组和数组指针

     指针数组(Array of Pointers): 

        int *array[10];

       如英文定义,是由Pointer组成的Array,本质是一个Array,Array中的每一个元素都是一个Pointer,如上面的例子,array[i]是一个指向int类型的指针。

     数组指针(Pointer to Array):

       int (*array)[10];

       如英文定义,是一个指向Array的Pointer,如上定义,因为[]的优先级最高,需要对*array加括号,这个指针指向一个一维数组,array++,指针会向后偏移一维数组(int array[10])所占的空间。使用Pointer to Array,可以很方便实现二维数组。

   2)指针函数和函数指针

     函数指针(Pointer to Function):

     函数指针在Linux中非常普遍,回调函数或处理函数都会使用 函数指针来定义,这样代码只需定义一个框架,程序实现时根据不同的需求传入不同的函数指针,可以实现类似高级语言多态的功能。

     比如大名鼎鼎的signal函数,定义如下:

     typedef void (*sighandler_t)(int);
     sighandler_t signal(int signum, sighandler_t handler);

      在Linux的设备驱动中,open、read、write操作也是函数指针,

    static const struct file_operations fifo_operations = {
      .owner = THIS_MODULE,
      .open = dev_fifo_open,
      .read = dev_fifo_read,  
      .write = dev_fifo_write,
     };

    指针函数(Function returnning Ponter):

    看过英文定义,就能明白这是某些从业者主观臆造的的定义,也是很操蛋的定义。

    C语言本身没有指针函数的概念,这个是指返回值是指针的函数,比如大名鼎鼎的 void *malloc(size_t size);

    如果说上面三个概念还有作用,定义指针函数除了混淆视听之外,是毫无作用。既然将返回值是指针的函数定义为指针函数,那为什么不再定义整形函数、字符函数、void函数、结构体函数,从而覆盖所有类型范围值的函数呢?

  

   

你可能感兴趣的:(编程技巧)