指针数组 ,数组指针,函数指针,指针函数,函数指针数组,指向函数指针数组的指针

1.指针数组

  • 定义:数组元素全为指针的数组称为指针数组。例如:char *arr[3]。
  • 本质:数组。
    这里写图片描述

2.数组指针

  • 定义:指向数组地址的指针称为数组指针。例如:int (*p)[3]。
  • 本质:指针。
    这里写图片描述
    3.指针数组和数组指针的对比

  • 数组指针是指向数组首元素的地址的指针,其本质为指针(这个指针存放的是数组首地址的地址,相当于2级指针,这个指针不可移动);指针数组是数组元素为指针的数组,其本质为数组。

  • 例如:p[]是指针数组,实质是一个数组,里面的两个元素都是指针[]的优先级比的优先级高,p先与[]结合,形成数组p,有两个元素的数组,再与*结合,表示此数组是指针类型的,每个数组元素相当于一个指针变量
  • 而(p)[]则为数组指针,实质是一个指针,因为有了(),所以p先与结合形成指针,再与[]结合,表示是指向整个这个数组的指针。

4.指针数组与二维数组的对比

  • 二维数组:如char string_1只要定义了一个二维数组,无论赋不赋值,系统都会给他分配相应空间,而且该空间一定是连续的。其每个元素表示一个字符。我们可以通过制定下标对其元素进行修改。
  • 指针数组:如char*str_B系统至少会分配5个连续的空间用来存储5个元素,表示str_B是一个5个元素的数组,每个元素是一个指向字符型数据的一个指针。如果我做这样的定义:
    chara={“gain”,”much”,”strong”};
    char*n={“gain”,”much”,”strong”};
    他们在内存的存储方式分别如右图所示,可见,系统给数组a分配了
    3×8的空间,而给n分配的空间则取决于具体字符串的长度。
    此外,系统分配给a的空间是连续的,而给n分配的空间则不一定连续。
  • 由此可见,相比于比二维字符数组,指针数组有明显的优点:一是指针数组中每个元素所指的字符串不必限制在相同的字符长度;二是访问指针数组中的一个元素是用指针间接进行的,效率比下标方式要高。但是二维字符数组却可以通过下标很方便的修改某一元素的值,而指针数组却无法这么做。

5.函数指针

  • 定义:指向函数的指针。
  • 本质:指针。
    这里写图片描述
    6.指针函数

  • 定义:返回值是指针的函数称为指针函数。

  • 本质:函数。
  • 定义格式:返回类型标识符 *返回名称(形式参数表);例如:int *p(int , int)

7.函数指针数组

  • 定义格式一:用类似定义数组的方法直接定义
vide(*arr[])(int*,int)=
{
    函数1,
    函数2
    …
    函数n
};
//内部函数声明
void 函数1(int arr[],int n)//int arr[]等同int arr*
{

}
  • 定义格式二:采用 typedef 作为辅助。
typedef void(*arr[])(int*,int); //使用 typedef 声明一个名为 arrf 的函数指针数组类型
arr a=                          //定义一个函数指针数组变量,并将它初始化
{
    函数1,
    函数2
    …
    函数n
};

注:根据搜狗百科整理和修改

猜你喜欢

转载自blog.csdn.net/weixin_40995778/article/details/80374753