对数组的深度理解
来源:互联网 发布:java算法有哪些 编辑:程序博客网 时间:2024/05/22 10:47
1.指针数组与数组指针
指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身 决定。它是“储存指针的数组”的简称。
数组指针:首先它是一个指针,它指向一个数组。在 32 位系统下永远是占 4 个字节, 至于它指向的数组占多少字节,不知道。它是“指向数组的指针”的简称。
int *p[10];int (*p)[10];
究竟哪个是指针数组?哪个是数组指针呢?这里需要明白一个符号之间的优先级问题。 “[]”的优先级比“”要高。p1 先与“[]”结合,构成一个数组的定义,数组名为 p1,int 修饰的是数组的内容,即数组的每个元素。那现在我们清楚,这是一个数组,其包含 10 个 指向 int 类型数据的指针,即指针数组。至于 p2 就更好理解了,在这里“()”的优先级比 “[]”高, “*”号和 p2 构成一个指针的定义,指针变量名为 p2,int 修饰的是数组的内容, 即数组的每个元素。数组在这里并没有名字,是个匿名数组。那现在我们清楚 p2 是一个指 针,它指向一个包含 10 个 int 类型数据的数组,即数组指针。我们可以借助下面的图加深 理解:
2.函数指针
顾名思义,函数指针就是函数的指针。它是一个指针,指向一个函数。
我们定义了函数指针,又该如何使用它呢?下面我们来看一段代码:
#include <stdio.h>#include <string.h>char* fun(char* p1,char* p2) {inti = 0; i = strcmp(p1,p2); if (0 == i) {returnp1; } else {returnp2; }}int main(){char* (*pf)(char* p1,char* p2); pf = &fun; (*pf)("aa","bb");return 0;}
我们使用指针的时候,需要通过钥匙(“*”)来取其指向的内存里面的值,函数指针使 用也如此。通过用(*pf)取出存在这个地址上的函数然后调用它。
下面我们来分析一段代码
(*(void(*)())0)();
第一步:void(*)(),可以明白这是一个函数指针类型。这个函数没有参数,没有返回值。
第二步:(void(*)())0,这是将 0 强制转换为函数指针类型,0 是一个地址,也就是说一 个函数存在首地址为 0 的一段区域内。
第三步:((void()())0),这是取 0 地址开始的一段内存里面的内容,其内容就是保存 在首地址为 0 的一段区域内的函数。
第四步:((void()())0)(),函数调用
3.函数指针数组
它是一个数组,下面写一段代码来理解函数函数指针数组怎么使用呢?只要真正掌握了使用方法, 再复杂的问题都可以应对。如下:
#include <stdio.h>#include <string.h>char* fun1(char* p){printf("%s\n",p);returnp;}char* fun2(char* p){printf("%s\n",p);}char* fun3(char* p){printf("%s\n",p);returnp;}intmain(){char* (*pf[3])(char* p);pf[0]= fun1; // 可以直接用函数名pf[1]= &fun2; // 可以用函数名加上取地址符pf[2]= &fun3;pf[0]("fun1");pf[0]("fun2");pf[0]("fun3");return0;}
4.指向函数指针数组的指针
这里的函数指针数组指针不就是 一个指针嘛。只过这个指针指向一个数组,这个数组里面存的都是指向函数的指针。下面就定义一个简单的函数指针数组指针:
char* (*(*pf)[3])(char* p);
这个指针指向一个包含了 3 个元素的数组;这个数字里 面存的是指向函数的指针;这些指针指向一些返回值类型为指向字符的指针、参数为一个 指向字符的指函数。其用法与前面讲的数组指针没有差别。下面列一个简单的例子:
#include <stdio.h>#include <string.h>char* fun1(char* p){printf("%s\n",p);returnp;}char* fun2(char* p){printf("%s\n",p);returnp;}char* fun3(char* p){printf("%s\n",p);returnp;}intmain(){char* (*a[3])(char* p);char* (*(*pf)[3])(char* p);pf = &a;a[0]= fun1;a[1]= &fun2;a[2]= &fun3;pf[0][0]("fun1");pf[0][1]("fun2");pf[0][2]("fun3");return0;}
- 对数组的深度理解
- 对数组的理解
- 对数组指针的理解
- 对二维数组的理解
- 对“数组指针”的理解
- 对数组指针的理解
- 对java数组的理解
- 对多维数组的理解
- 对指针数组的理解
- 对数组名的理解
- 对操作系统、软件的深度理解
- 我对跳槽的深度理解
- 对“深度学习”的一些理解
- 对onMeasure方法的深度理解
- 深度学习中对神经网络的理解
- 对“深度优先遍历”的理解
- 对深度强化学习的理解
- 深度学习中对 end2end的理解
- 编程世界的那把锁
- Linux 驱动程序 USB控制
- 开放平台-web实现QQ第三方登录
- 收集程序异常信息
- 在 Ubuntu 12.10 中使用 Virtualbox 安装 Win7
- 对数组的深度理解
- Sketch Tutorial
- OPenCv读取MP4视频
- 文章标题
- Nginx HTTP缓存设置
- mysql 与 excel
- 非常详细的 Docker 学习笔记
- SBT 工程部署记录
- 操作系统复习-1.1操作系统的基本概念