目录

指针数组

数组指针

函数指针

总结


指针数组

首先要明确指针数组是数组而不是指针,是一个存放指针的数组。

数组里面存放的都是地址

声明一个指针数组的方式是

int* arr1[5]; //整形指针的数组
char* arr2[4]; //一级字符指针的数组
char** arr3[5];//二级字符指针的数组

int* arr1[5]表明arr1这个数组里面存的成员是int*类型的,最多可以存放5个int*类型的指针,所以他是一个存放整型指针的数组。

举一些例子:

int main()
{int a = 10, b = 20, c = 30;int* arr1[3] = { &a,&b,&c };char str1[] = "abc", str2[] = "bcd", str3[] = "cde";char* arr2[] = { str1,str2,str3 };printf("%p %p %p\n", arr1[0], arr1[1], arr1[2]);printf("%d %d %d\n", *arr1[0], *arr1[1], *arr1[2]);printf("%p %p %p\n", arr2[0], arr2[1], arr2[2]);printf("%s %s %s\n", arr2[0], arr2[1], arr2[2]);return 0;
}


数组指针

和指针数组相反,数组指针不是数组,而是一个指向数组的指针。

int (*p)[10]; *先和p结合,说明p是一个指针变量,然后指向一个大小为10的数组,该数组成员的类型为int类型。int *p[10],[]的优先级大于*,所以要保证*首先和p结合,就得加上括号,否则就成为了一个指针数组。

 int arr[] = { 1,2,3 };int(*p)[3] = &arr;

在此之前有必要说明一下是arr与&arr的区别

arr是数组中首元素地址,&arr是整个数组的地址,他两的值相同,但是表达的意思天差地别

arr+1是下一个元素的地址;&arr+1直接跨过整个数组,是数组最后一个元素下一个空间的地址。

上面代码的意思(*p)说明p是指针,这个指针指向数组arr有3个元素。int代表指向元素的类型是

整型。

int* arr[3] = { 0 };
int* (*p)[3] = &arr;

同理,这段代码,(*p)说明p是指针,[3]说明指向的数组的元素总共3个,int* 说明的是指向每个元素的类型。

数组指针如何用

int main()
{int arr[] = { 1,2,3 };int(*p)[3] = &arr;for (int i = 0; i < 3; i++){printf("%d ", (*p)[i]);}return 0;
}

其实*p==arr,输出还可以这样写 *(*p+i)也是对的。

一般在二维数组中用的多

例如int arr[3][3]={{1,2,3},{2,3,4},{3,4,5}};arr是首元素地址,此地址也是第一行的地址,也就是说*(arr+1)并不是arr[0][1],而是arr[1][0],arr+1横跨第一行,是第二行的地址

所以二维数组任意一个元素可以表示成( *(arr+i) )[ j ]或者*(*(arr+i)+j)。

所以在函数传参的时候,当需要将二维数组作为形参时,可以传递数组指针void fuc(int (*p)[3]);

为了加深理解,可以看一下这几个例子

 int arr[5];int *parr1[10];int(*parr2)[10];int(*parr3[10])[5];

第一个为简单的数组,里面元素类型为int;

第二个为指针数组,元素类型为int*;

第三个数组指针,指向的数组空间大小为10个int类型;

第四个从里往外理解,首先parr3和[ ]结合,说明是一个数组大小为10个元素,每个元素类型为指针;这个数组里面的指针又和[5]结合,说明数组里面每个指针都指向含有5个int类型成员的数组。


函数指针

任何一个函数int fuc(int x, int y){};都有他自己的地址。fuc或者&fuc就是他的地址。

如何定义一个函数指针

int (*pa)(int, int)=fuc;

第一个int为函数的返回值,括号里面的int为函数形参的类型。

(*pa)(x, y);或者pa(x, y);都可以调用函数。但是*pa(x, y);是错误的方式,注意符号优先级。

如何理解(*(void(* )( ))0)( );

(void(* )( ))是一个函数指针类型,将0强制类型转换为函数指针,也就是把0作为函数的地址,通过*解引用调用0地址处的该函数

如何理解void(*signal(int, void(*)(int)))(int);

首先它是由两部分组成void(*  )(int)和signal(int, void(*)(int)),后者是函数,前者是指针类型,组合起来signal函数的返回值为函数指针,他的形参一个为int,一个为函数指针

前面讲过指针数组,数组指针,那么函数同样有自己的函数指针数组指向函数指针数组的指针

函数指针数组

存函数地址的数组

定义

int (*arr[5])(int, int)={  }; 前提是这几个函数的类型都一样

用途:转移表,可以将相同类型的函数合在一起,减少代码的冗余度和可读性

指向函数指针数组的指针

定义

int(*(*parr)[5])(int, int);

parr一个数组指针,指针指向的数组有5个元素,每个元素的类型是一个函数指针


总结

这一部分的东西有一点绕,得自己去敲代码调试加以理解效果更好。

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

  1. 指针详解(包含指针,指针数组,数组指针,指向数组指针的指针,函数指针,函数指针数组,指向函数指针数组的指针)

    大家都知道,指针有双面性,灵活度高,但是运用时一定要避免野指针和空指针的出现.否则会出现一些意想不到的错误.话不多说,看下面的代码: int main() {int arr[10] = { 0 };/ ...

  2. 详解多维数组与指针之间的关系

    一维数组 先介绍一下简单的一维数组: 列如: int a[3] = {0,1,2}; [3]和类型int则明确表示编译器应该为这个栈分配多大的内存,也就是三个int大小! 在内存中示意图是: 在CPU ...

  3. c语言char数组和short数组的区别,详解C语言中Char型指针数组与字符数组的区别

    详解C语言中Char型指针数组与字符数组的区别 详解C语言中Char型指针数组与字符数组的区别 1.char 类型的指针数组:每个元素都指向一个字符串,指向可以改变 char *name[3] = { ...

  4. C语言指针的那些事:第三篇(函数指针,指针函数,函数指针数组,指向函数指针数组的指针)

    文章目录 1. 函数指针 1)函数指针的例题 2. 指针函数 3. 函数指针数组 1)函数指针数组的用途 4. 指向函数指针数组的指针 5. 一些后话 1. 函数指针 函数指针就是指向函数的指针:本质 ...

  5. 指针数组概念 和 函数指针数组实战 和指针函数的概念和实战

    1.指针数组概念 int (*p)[4]; 是一个数组指针 ,强调的是指针,这是指针指向的是某个数组 (*p)这个指针含有四个元素的一维数组 指针数组呢? 强调的是数组 我们可以定义一个数组,数组里面 ...

  6. 【C语言】函数指针数组和指向函数指针数组的指针

    一.函数指针数组 1.1函数指针数组的声明 函数指针数组的声明如下,所谓函数指针数组就是在之前的函数指针的基础上增加了[],由于[]的优先级高于*,故 pf先与[]结合,说明它是一个数组,再与*结合说 ...

  7. 图解C语言中数组指针、指针数组、函数指针、函数指针数组、指向函数指针数组的指针

    关于C语言中数组指针.函数指针.指针数组.函数指针数组.指向函数指针数组的指针一直比较绕,稍微整理一下. 到底是指针还是数组? 其实到底是指针还是数组还是看变量名与[]先结合还是*先结合.我们知道C语 ...

  8. 【指针进阶06】函数指针数组

    函数指针数组 把函数的地址存到一个数组中,那这个数组就叫函数指针数组: int ( * parr1 [10] ) ( ); parr1先和 [ ] 结合,说明parr1是数组,数组的内容是什么呢? 是 ...

  9. 详解函数指针和类成员函数指针

    作者:倾夜·陨灭星尘 一.什么是函数指针? 函数指针,顾名思义即指向函数的指针. 如果要问,为什么能用一个指针指向一个函数呢?我觉得要理解这个问题,以及要理解后面的函数指针和类成员函数指针,没有什么比 ...

  10. c语言malloc用法 数组,详解C语言用malloc函数申请二维动态数组的实例

    详解C语言用malloc函数申请二维动态数组的实例 C语言在程序运行中动态的申请及释放内存十分方便,一维数组的申请及释放比较简单. Sample one #include int main() { c ...

最新文章

  1. 它来了!ROS2从入门到精通:理论与实战
  2. 华为汪涛:定义5.5G,构建美好智能世界
  3. LeetCode Algorithm 414. 第三大的数
  4. python一到10整数的平方和_零基础学python_10_列表(创建数值列表 )
  5. Spring Mobile 1.1.0.RC1 和 1.0.2 发布
  6. MATLAB矩阵复制数据
  7. 【转】QT中使用MYSQL中文乱码解决方法
  8. pap与chap协议
  9. [转]STL的内存分配器
  10. quartz--关于Scheduler
  11. paip.点击每个网页链接都提示下载的解决。
  12. 如何写一个脚本(附送一个脚本)
  13. mysql数据库查询优化技术 视频_那海蓝蓝 MySQL数据库查询优化技术视频教程
  14. MYSQL实现排序分组取第一条sql
  15. python安装外部模块Django
  16. 某些app无法抓包问题
  17. 世界最牛的25位顶尖大数据科学家
  18. mail = imaplib.IMAP4_SSL('k20gslf-0kF')
  19. [android] 手机卫士号码归属地查询
  20. SpringBoot 自定义实现一个启动器starter 教程。

热门文章

  1. 100亿数据找出最大的1000个数字的4种方法
  2. jquery实现表情图添加与发布功能
  3. 使用word自带功能快速编辑公式
  4. A股打新需要什么条件?如何参与A股打新?(A股打新看这篇文章就够了)
  5. 计算机学院新闻部纳新稿子,【万象更新】水建院新闻中心纳新啦!
  6. Vue开发实战一:FormData参数传递
  7. c语言六个数码管显示123456,用51单片机C语言编写程序实现6位共阴极数码管循环显示0123456789ABCDEF,六个数码管是连续不同的六个数?...
  8. C++编程法则100条(4)空{}初始化讨论,A a{};表示什么意思?
  9. 11~13k(初/中级)前端面试看这篇就够了
  10. word页眉横线怎么删除(word页眉横线如何设置)