对数组的深度理解

来源:互联网 发布: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;}
1 0
原创粉丝点击