关于指针,函数和数组

指针,数组,函数分别在C语言学习中,都很重要的东西。也是大多数同学较为头疼的,那么函数,数组和指针组合在一起,又会又哪些新的变量类型呢。
在这之前,我先要和大家强调一点,,,其实指针就是指针,数组就是数组。数组和指针之间,,,没关系~     只是他们在访问内部变量时的形式可以相同。
所有我们要特别区分几个量:指针数组
,数组指针
,函数指针
,函数指针数组
和指向函数指针数组的指针
一.指针数组:
本质就是一个数组,里面存放的元素类型是指针,比如: int *nums[10]     (定义了一个名称为num的长度为10的存放元素类型为int型指针 变量的数组。)数组中的每个元素都是一个指针,每个指针都可以指向一个字符串。
二 . 数组指针:
本质就是一个指针,可以指向一个数组,比如:int  (*p)[4]  (表示定义一个数组指针,指向含4个元素int型的一维数组。)
区别指针数组,和数组指针。如果是文字则这个变量的类型看最后两个字,如果是表达式,我们就要看变量名先于谁结合,这里就要引用运算符的优先级了,(),[ ],的优先级都比 * 高,所有加(* 变量名)时,才是指针。
三.函数指针:
本质上还是一个指针。是指向函数的指针,也就是说该指针变量存放的是函数的入口地址。
函数名可以便是该函数的地址,&函数名也可以表示。
例如:int strcmp(char , char )的函数指针定义:int (p)(char, char *)
四 . 函数指针数组 :
本质上是一个数组。(综上四种类型可知一个变量的类型看表述的最后两个字即可)存放的是指向各个函数的指针,也就是说该数组存放的指针变量,指向的是函数的入口地址。例如:int (strcmp[ 10 ])(char ,char ) ;返回值为int 类型的,带有两个参数(分别为char ,char *)的函数指针数组。
他可以存放一系列参数类型相同,返回值类型相同的类似函数,在使用时通过数组调用,减小了时间复杂度。
五 . 指向函数指针数组的指针
我们比较容易的就看出这是一个指针类型。他和函数指针数组的区别在哪呢?就是多了个()所有我们的例如:可以这样写:int ((*strcmp)[10])(char ,char);这就比较复杂了,一般使用起来也不方便,可读性也不强,一般不适用。
我们试着使用一下函数指针数组:使用函数指针数组代替switch函数,代码量一下子就减少了不少。

#include<stdio.h>
int Add(int a, int b){ return a+b;}
int Sub(int a, int b){ return a-b;}
int Mul(int a, int b){ return a*b;}
int Div(int a, int b)
 {
      if(b==0)return -1;
      return a/b;
}

int main(){
    int a=22,b=3;
    int (*ptr[4])(int ,int )={Add,Sub,Mul,Div};

    printf("the result is :%d"\n,prt[1](a,b));
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_40921797/article/details/78855388