关于指针整体复习

63 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情

大家好,我是芒果,一名非科班的在校大学生。对C/C++、数据结构、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流

作者简介:

1.复习

关于函数

int Add(int x,int y)
{
    return x+y;
}
&Add 和Add是完全相同的

而对于数组,&arr 和arr虽然地址值一样,但是含义是不一样的。

&arr+1:跳过一个数组的内容 arr+1:跳到第二个元素


函数指针

int Add(int x,int y)
{
    return x+y;
}
int Sub(int x , int y)
{
    return x -y;
}
int main()
{
   int(*pA)(int,int) = Add;
   //也可以写成 int(*pA)(int x,int y) = &Add; 
    //Add和&Add是一回事
    //含义:pA是指针,是函数指针,指向的函数的参数是(int,int),返回类型是int
    int(*pB)(int,int)=Sub;
        //含义:pB是指针,是函数指针,指向的函数的参数是(int,int),返回类型是int
    int ret = (*pA)(2,3);	//pA指向Add函数,解引用指针就是该该函数
    int ret2 = pA(2,3);		//pA能接收该函数,说明pA == Add,其实也源于 &Add == Add 所以不需要解引用代表的也是Add
    int ret3 = Add(2,3);	
    int ret4 = (&Add)(2, 3);
    printf("%d %d %d %d\n", ret, ret2, ret3,ret4);// 5 5 5 5
}

函数指针数组和指向函数指针数组的指针

函数指针数组:是数组,数组元素是函数指针

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

int Add(int x,int y)
{
    return x+y;
}
int Sub(int x , int y)
{
    return x -y;
}
int main()
{
    int (*pArr[3]) (int,int) = {Add,Sub};
    //也可以写成: int (*pArr[3]) (int x,int y) = {Add,Sub};
   	//pArr是函数指针数组,
    //去掉数组名和元素个数就是数组元素类型
    //-> int(*)(int ,int) ->数组元素类型为函数指针
    
    int(*(*p)[3])(int,int)=&pArr;
    //p是数组指针,是指针
    //该指针指向一个数组,数组元素为3个
    //去掉数组名和元素个数就是数组元素类型  (去掉(*p)[3])
    //-> int(*)(int,int) ->函数指针
    //所以该数组是函数指针数组,元素个数为3个
    //p是指向函数指针数组的指针
    
    int ret = (*pArr)(2, 3);
    printf("%d ", ret);  //5
    
    int ret2 = (*(*p))(2, 3);
    printf("%d", ret2);  //5
    return 0;
}

image-20220214211756563

首先明确:pArr:函数指针数组   p:指针,指向函数指针数组的指针 
pArr:数组名->首元素地址  一级指针
&pArr:数组的地址->地址值和首元素地址一样,但是含义不一样  
p:存放的内容为:数组pArr的地址 相当于二级指针
&p:指针变量自身的地址
    所以  *p == pArr pArr[0] == *(pArr+0) == *(*p+0)

回调函数

int Add(int x, int y)
{
    return x + y;
}
int Sub(int x, int y)
{
    return x - y;
}
//使用函数指针接收
void Calc(int(*pf)(int, int))
{
    //输入两个操作数
    int a = 0;
    int b = 0;
    printf("请输入两个操作数\n");
    scanf("%d %d", &a, &b);
    int ret = pf(a,b);	//调用传过来的函数
    printf("运算结果为:%d\n", ret);
}
int main()
{
    Calc(Add);
    Calc(Sub);
    return 0;
}