指针知识梳理

  • 一、字符指针
  • 二、数组指针
  • 三、函数指针与函数指针数组
    • 1、指针函数
    • 2、函数指针
    • 区别
    • 3、函数指针数组
    • 4、指向函数指针数组的指针
  • 四、回调函数

一、字符指针

指向字符型数据的指针变量。每个字符串在内存中都占用一段连续的存储空间,并有唯一确定的首地址。即将字符串的首地址赋值给字符指针,可让字符指针指向一个字符串。
char *
代码 char* pstr = “hello world.”; 本质是把字符串 hello world. 首字符的地址放到了pstr中。

即把一个常量字符串的首字符 h 的地址存放到指针变量 pstr 中。

二、数组指针

数组指针是一个指针,该指针指向的是一个数组;
&数组名VS数组名
对于 int arr [20] ;
&arr 表示的是数组的地址,而不是数组首元素的地址。(细细体会一下)数组的地址+1,跳过整个数组的大小,所以 &arr+1 相对于 &arr 的差值是40.
数组指针与指针数组
数组指针指向的是数组,那数组指针中存放的应该是数组的地址。

三、函数指针与函数指针数组

1、指针函数

指针函数就是返回指针值的函数,本质是一个函数。所以指针函数等价于“返回值为指针的函数”。

2、函数指针

函数指针就是一个指向函数的指针。每个函数在编译时,会被分配一个入口地址,一般用函数名来表示,这个地址就是该函数的指针。
声明形式:type (*func)(参数列表 )

#include <stdio.h>
void test()
{printf("hehe\n");
}
int main()
{printf("%p\n", test);printf("%p\n", &test);return 0;
}

区别

从上面的定义形式可以看出,函数指针和指针函数的直观上区别在于指针符号*与函数名/指针名有没有用括号()包裹起来,从这一点来看是很容易区分两者的。

3、函数指针数组

数组是一个存放相同类型数据的存储空间,如指针数组:

int *arr[10];
//数组的每个元素是int*

那要把函数的地址存到一个数组中,那这个数组就叫函数指针数组,如函数指针的数组的定义;

int (*parr[10]])();

指针数组是一个数组,数组的元素保存的是指针;
就是每个元素都是函数指针的数组,直接在函数指针名后面加上数组符号[ ]即可。
声明形式:type (*func[ ])(参数列表 )
函数指针数组的用途:转移表

4、指向函数指针数组的指针

指向函数指针数组的指针是一个 指针 指针指向一个 数组 ,数组的元素都是 函数指针 ;
声明形式:type (* (*func )[ ])(参数列表 )

void test(const char* str)
{printf("%s\n", str);
}
int main()
{//函数指针pfunvoid (*pfun)(const char*) = test;//函数指针的数组pfunArrvoid (*pfunArr[5])(const char* str);pfunArr[0] = test;//指向函数指针数组pfunArr的指针ppfunArrvoid (*(*ppfunArr)[10])(const char*) = &pfunArr;return 0;
}

四、回调函数

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
首先演示一下qsort函数的使用:

#include <stdio.h>
//qosrt函数的使用者得实现一个比较函数
int int_cmp(const void * p1, const void * p2)
{return (*( int *)p1 - *(int *) p2);
}
int main()
{int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };int i = 0;qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof (int), int_cmp);for (i = 0; i< sizeof(arr) / sizeof(arr[0]); i++){printf( "%d ", arr[i]);}printf("\n");return 0;}

数组指针、函数指针与函数指针数组相关推荐

  1. C++ 笔记(14)— 指针(指针声明、取地址、取值、new/delete、NULL指针、指针运算、指针数组、数组指针、指针传递给函数、从函数返回指针)

    1. 声明指针 指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址.就像其他变量或常量一样,您必须在使用指 针存储其他变量地址之前,对其进行声明. 指针变量声明的一般形式为: type * ...

  2. Go 学习笔记(13)— 指针定义、指针特点、空指针、指针数组、指向指针的指针、指针作为函数入参

    1. 复合数据类型 Go 语言基本的复合数据类型有指针.数组.切片.字典.通道.结构和接口等.格式如下: * pointerType // 指针类型, [n]elementType // 数组类型, ...

  3. 用指针、子函数的方法去一维数组中所有元素的平均值,并放在a[0]处

    <程序设计基础实训指导教程-c语言> ISBN 978-7-03-032846-5 p142 7.1.2 上级实训内容 [实训内容7]用指针.子函数的方法去一维数组中所有元素的平均值,并放 ...

  4. c/c++ 函数、常量、指针和数组的关系梳理

    压力才有动力,15年中旬就要准备实习,学习复习学习复习学习复习学习复习--无限循环中,好记性不如烂笔头--从数组开始,为主干. c 的array由一系列的类型相同的元素构成,数组声明包括数组元素个数和 ...

  5. 【C 语言】数组 ( 多维数组做函数形参退化为指针过程 | int array[2][3] -> int array[][3] -> int (*array)[3] )

    文章目录 一.多维数组做函数形参退化为指针过程 1.使用 int array[2][3] 作函数参数 2.使用 int array[][3] 作函数参数 3.使用 int (*array)[3] 作函 ...

  6. 指针数组,数组指针,函数指针,main函数实质,二重指针,函数指针作为参数,泛型函数

     1.指针数组 数组里面的每个元素都是指针. 指针数组的案例如下: 易犯错误: 2.数组指针 归根结底还是指针,只是取*的时候能够取出一整个数组出来. 数组指针:(一个指针指向了数组,一般和二维数 ...

  7. 指针数组,数组指针,函数指针,main函数实质,二重指针,函数指针作为參数,泛型函数...

     1.指针数组 数组里面的每一个元素都是指针. 指针数组的案比例如以下: 易犯错误: 2.数组指针 归根结底还是指针,仅仅是取*的时候可以取出一整个数组出来. 数组指针:(一个指针指向了数组.一般 ...

  8. 《C++ Primer 第五版》(第6.3~6.7节)——返回指向数组/函数的指针,函数重载,默认形参、inline函数和constexpr函数

    1.返回指向数组/函数的指针 顾名思义,就是函数返回值为指向数组/函数的指针. 数组的性质:不能被拷贝,函数也不能返回数组.但可以返回数组指针/引用,声明一个返回数组指针的函数,有四种方式,一种是直接 ...

  9. C/C++函数指针与回调函数总结(函数指针数组)

    函数有它的地址,程序运行起来了,程序里肯定有地方要放这个函数.我们知道可以用printf  %p来输出一个变量的地址,数组的地址,同样我们定义了一个函数后,用这个函数的名字做输出,就可以得到这个函数的 ...

  10. C/C++中数组作为函数形参后退化为指针

    最近写了一个函数,把数组作为了它的参数,在这个函数中用到了这个数组的长度,按照正常的求长度的方式,应该不会出错:但是运行之后发现结果却不是我想要的.于是写了一个测试程序来验证我的猜想. #includ ...

最新文章

  1. AJAX ||JQeury实现方式||原生的JS实现方式(了解)
  2. 三刷进博 | 跨界直播,组团参展,施耐德电气有备而来!
  3. 2、Spring Cloud - 入门概述
  4. 开源自建/托管与商业化自研 Trace,如何选择?
  5. 汇编和c语言混合编程缺点,汇编C语言混合编程经验总结
  6. 计算机考研专业基础知识视频教程链接
  7. 郭新华 php,PHP常驻进程编程需知 郭新华 PHPCON2019
  8. R con not resolved of types
  9. jmeter参数化之配置元件CSV控件
  10. 基于Web应用的性能分析及优化案例
  11. 计算机思维中核心要素,思维导图核心三要素
  12. masm5安装教程_MASM5.0汇编器使用
  13. 网络爬虫——淘宝网页面分析思路
  14. Linux架设DNS服务器(ChinaITLab.com 搜集整理)
  15. MacBook连接打印机-惠普HP LaserJet Pro MFP M427fdn 连接方法
  16. HTML中的元素分类
  17. iphone11拍照没有咔嚓声
  18. 如何检查Mac配备的显卡(GPU)?
  19. 图解希尔排序(Shell Sort)
  20. GitHub入门(2)

热门文章

  1. Andriod修改之GG代码换成直装
  2. Win2016以及win10 IIS10 下安装IEwebcontrol的方法
  3. Lifecycle的原理
  4. java进阶--数据库篇(Mysql)
  5. Windows 查看端口是否已打开(转)
  6. 面向过程和面向对象的理解
  7. 关于IIS URL 重写, 规则模式
  8. 《我的第一本C++书》迷你书——看图学C++免费下载
  9. 织梦仿站系列教程第十一讲——幻灯片的制作
  10. 第1周 - 课程材料