【C语言篇】☞ 14. 高级指针、判断类型

高级指针

  高级指针:包括双指针(二级指针)、void指针、函数指针。

 1. 双指针

  双指针(二级指针),是指针的指针。

   

2. void指针  

  void指针:万能指针,代表任意类型的指针。

  malloc分配堆内存时,由于无法确定内存存储类型,所以可以使用void*代表任意指针类型。

  

3. 函数指针

  • 函数指针是指向函数的指针变量,每个函数都有一个入口地址,指针变量中保存函数的入口地址
  • 每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样。
  • 函数指针有两个用途:调用函数和做函数的参数。

  函数指针的声明方法为:

返回值类型 (*指针变量名) ([形参列表]);

 

  函数指针(指向函数的指针)的定义格式:

  

  函数也会占用一块存储空间,因为函数也会占用一块存储空间所以函数也有自己的地址

  函数的地址保存在函数名中,函数名就是函数的地址 == 数组名就是数组的地址

  数组名就是指向数组第一个元素的常量指针,函数名也是指向函数第一条指令的常量指针

 

函数指针的语法格式:

  

  

函数指针的优缺点:

  • 优点:是对于通用函数中要涉用到另一个函数,但函数名称未定,是让用户编的,此时需要使用函数指针。

如,通用定积分计算,被计算函数是待定的,是由调用者确定的函数

如,通用排序函数也是,比较函数与交换函数也是让用户自己编的

  • 缺点:是由于函数指针指向的函数未定,容易导致程序崩溃。

  

 

判断类型

  怎么判断类型:从右往左边看,没有括号就看最右边是什么类型就是什么类型;有括号,括号里是什么类型就是什么类型。

 

  • int *a[10]  指针数组 
    • []的优先级比*高,a代表一个数组,其数组元素存储的类型是int *;
    • a的值代表数组首元素a[0]的地址值,是一个指针,即*a=a[0],只是需要注意的是这个指针类型为const,即不能改变的。
  • int (*a)[10] 数组指针
    • a代表一个数组指针,它指向一个int [5]型的数组;因为a的类型,所以a++后,它会偏移sizeof(int)*5 个字节。
  • (int)有参数就是函数

    •  

      int (*a)(int)  函数指针

    •  

      int *a (int)   指针函数

  函数和方法的区别:函数是大家的,没有类。方法是类的,不是所有人都能用。

原文地址:https://www.cnblogs.com/bossren/p/6422224.html