指针难点

  • 1.指针
    • 1.1指针数组和数组指针
  • 2.右左法则
  • 3.函数指针和指针函数
    • 示例1
    • 示例2
    • 示例3(面试题)

1.指针

1.1指针数组和数组指针

  • 指针数组是一个数组,数组里面存放的内容是指针

int *arr[10]

#include<iostream>
int main()
{int a = 10;int b = 11;int c = 12;int* q = &a;int* p = &b;int* l = &c;int* arr[] = { p,q,l };for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++){cout << *(arr[i]) << endl;}return 0;
}
  • 数组指针是一个指针,这个指针指向的对象是一个数组,经常用于二维数组

int (*arr)[10]

#include<iostream>
int print(int(*arr)[10])
{}
int main()
{int brr[10][10] = {0};print(brr);return 0;
}
  • 注意 其本身是一个运算符优先级问题,可以使用右左法则来分辨两者怕(后文会讲)

2.右左法则

  • 常用于区分指针数组和数组指针,用法如下
  1. 首先找到变量名,将变量名与右边内容结合,判断是指针还是数组,如果变量名带有括号,先算括号里的。
  2. 右边的看一个,再向左看一个,将内容往前写,直至左右一方没有了,再一次写下另一方
  • 可能比较抽象,我举个例子就好了
    int *(*p[3])(int) 是一个 指针函数指针数组,是一个存放指针的数组,数组中的指针指向的是参数为int类型的函数
int  *(*p[3])(int)
1.先找到变量名 p
2.p右边是[]说明是一个数组                             数组
3.p左边是一个指针                                  指针数组
4.右边是一个函数                                函数指针数组
5.左边是一个指针                            指针函数指针数组

3.函数指针和指针函数

  • 函数指针是一个指针,它指向的是函数的首地址(函数名)
  • 指针函数是一个函数,返回值类型是一个指针

示例1

int (*fn(int n))(int,int)
fn是个函数名,里面有int n参数,fn函数的返回值是个指针,这个指针指向函数int xx(int,int)此类函数

  • 回调函数
    函数指针的一个非常典型的应用就是回调函数。回调函数就是一个通过指针函数调用的函数。其将函数指针作为一个参数,传递给另一个函数。回调函数并不是由实现方直接调用,而是在特定的事件或条件发生时由另外一方来调用的。
int max(int a,int b)
{return a > b ? a : b;
}
int min(int a,int b)
{return a < b ? a : b;
}
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)
{return a / b;
}
int Mod(int a,int b)
{return a % b;
}
int (*fn(int n))(int,int)
{return max;
}
void print(int n)
{cout<<"print n = "<<n<<endl;
}
void (*fnn(int n,int (*p)(int,int)))(int)
{cout<<"fnn : n = "<<n <<","<< p(6,9)<<endl; //max(6,9)return print;
}
void main()
{void (*p)(int)  = fnn(5,max); //p = printp(100);//print(100)
}

上面代码函数有加减乘除,求最大最小值,从主函数开始分析,首先调用fnn函数,fnn函数两个参数分别为一个整形和一个函数指针,所以将max函数名传进去当作参数,形参p指向max函数,比较6,9的大小,返回print函数

void (*fnn(int n,int (*p)(int,int)))(int)
{cout<<"fnn : n = "<<n <<","<< p(6,9)<<endl; //max(6,9)return print;
}

(*p)(int)是一个函数指针,指向刚刚返回的print函数,调用print(100),打印100

void print(int n)
{cout<<"print n = "<<n<<endl;
}

示例2

void main()
{int (*p[])(int,int) = {max,min,Add,Sub,Mul,Div,Mod};int n = sizeof(p)/sizeof(p[0]);for(int i = 0;i<n;++i)cout<<p[i](4,9)<<endl;
}

  • max,min,Add,Sub,Mul,Div,Mod这几个函数都是同一类型的,至少都有两个相同类型的参数,可以定义一个函数指针数组来存放函数指针,分别指向这几个函数,这样在使用是可以当做数组使用非常方便,而且也方便更新。

示例3(面试题)

void mymalloc(char *p,int n)
{*p = (char*)malloc(n);
}
void main()
{char *str = NULL;mymalloc(str,100);strcpy(str,"hello world");puts(str);free(str);str = NULL;
}

以上代码能否完成malloc函数的功能?
答案: 不能,要改变一级指针内容传参时候必须传入二级指针,这样才能修改一级指针的内容

指针难点——数组指针、指针数组、函数指针、指针函数详解相关推荐

  1. php 合并数组对象,JS内数组合并方法与对象合并实现步骤详解

    这次给大家带来JS内数组合并方法与对象合并实现步骤详解,JS内数组合并方法与对象合并实现的注意事项有哪些,下面就是实战案例,一起来看一下. 1 数组合并 1.1 concat 方法var a=[1,2 ...

  2. Delphi Format函数功能及用法详解

    DELPHI中Format函数功能及用法详解 DELPHI中Format函数功能及用法详解function Format(const Format: string; const Args: array ...

  3. 互斥量、条件变量与pthread_cond_wait()函数的使用,详解(二)

    互斥量.条件变量与pthread_cond_wait()函数的使用,详解(二) 1.Linux"线程" 进程与线程之间是有区别的,不过linux内核只提供了轻量进程的支持,未实现线 ...

  4. python中tile的用法_python3中numpy函数tile的用法详解

    tile函数位于python模块 numpy.lib.shape_base中,他的功能是重复某个数组.比如tile(A,n),功能是将数组A重复n次,构成一个新的数组,我们还是使用具体的例子来说明问题 ...

  5. PHP函数call_user_func和call_user_func_array详解

    今天在群里面,有个叫lewis的在问call_user_func_array的用法,因为之前一直没有用过,也不能说什么,于是看一下手册,发现是这么写的: call_user_func_array (P ...

  6. python scatter参数详解_Python中scatter函数参数及用法详解

    最近开始学习Python编程,遇到scatter函数,感觉里面的参数不知道什么意思于是查资料,最后总结如下: 1.scatter函数原型 2.其中散点的形状参数marker如下: 3.其中颜色参数c如 ...

  7. Sklearn中predict_proba函数用法及原理详解

    Sklearn中predict_proba函数用法及原理详解(以logistic回归为例) 网上对predict_proba的数学原理解释的太少了,也不明确,特意总结一下,并给出有些不能用该方法的原因 ...

  8. 字符串拷贝函数:strcpy的详解及模拟实现

    字符串拷贝函数:strcpy的详解及模拟实现!!! 对于字符串拷贝函数,之前在学习字符串时候,就已经学习过,但那只是片面的学习了一下,并没有经过系统的分析!只是大概的学习了一下!在关键的地方有时候还不 ...

  9. python scatter参数详解_Python 中 scatter 函数参数及用法详解

    Python 中 scatter 函数参数及用法详解 Python 中 scatter 函数参数及用法详解 这里有新鲜出炉的 Python 教程, 程序狗速度看过来! Python 编程语言 Pyth ...

  10. python transpose函数_Tensorflow:转置函数transpose的使用详解

    我就废话不多说,咱直接看代码吧! tf.transpose transpose( a, perm=None, name='transpose' ) Defined in tensorflow/pyth ...

最新文章

  1. 动态代理竟然如此简单!
  2. 《JavaScript面向对象编程指南》——第1章 引言1.1 回顾历史
  3. 【spring-session】store-type
  4. 【Linux】一步一步学Linux——visudo命令(104)
  5. 有关Struts2a的ction直接使用response异步问题
  6. 华为大数求和 java_大数乘积java
  7. 前端学习(2133):前端代码复杂带来的问题
  8. mysql error 1201_ERROR 1201 (HY000): Could not initialize master info structure; .....
  9. python canopen_Python canopener包_程序模块 - PyPI - Python中文网
  10. 年薪30k-50k、面试通过率90%,这个职位到底是在做什么?
  11. 代码提交本地代码和远程代码不同步问题(笔记)
  12. 循环首次适应算法_数据结构与算法之2——排序问题
  13. 虚拟化小白对VMcpu分配的理解
  14. js常用方法之Array对象方法扩展
  15. keras训练cifar10数据集源代码
  16. python里使用正则表达式的后向搜索肯定模式
  17. React Native填坑之旅--class(番外篇)
  18. python爬虫学习教程,短短25行代码批量下载豆瓣妹子图片
  19. java获取oracle自增_Oracle自增列创建方法
  20. 了解计算机的配置及价格行情,最新电脑配置清单及价格的详细介绍

热门文章

  1. 一些好用的Mac软件推荐
  2. Photoshop CS6调整界面字体大小
  3. 祝学校计算机系的新年贺词,新年祝福语:学校新年贺词祝福短信
  4. cad2014打开文件崩溃_CAD2014非正常关闭后,临时文件打不开如何解决?
  5. 2008之囧言囧语集合
  6. 伺服电机步进电机区别
  7. 自考第三波+GCT考试总结
  8. 入手评测 骁龙768g相当于麒麟多少 骁龙768g和麒麟820哪个好
  9. linux常用的指令
  10. 用命令行编译java文件