指针数组和数组指针

Last updated on 3 months ago

指针 ,数组, 函数 这个概念并不会陌生,但是组合起来 就有很多含义,总是搞混,如 数组指针 ,数组指针 ,函数指针等等... 死记硬背是不可能的,在这里总结下规律==

指针数组

这个比较容易理解 ,我们日常使用的数组有 整型的数组,如 int a[100]; 有100个空间,里面都是存放整型变量的 , 也有浮点型的数组 float b[100]; 从前两个可以总结出这一类数组叫法都是 类型名 + 数组 , 我们也知道 指针也是类型! 只不过是比较特殊的类型(存地址)! 所以说 指针数组是存在指针的数组,那如何标识呢?

int *p[100] —-> int * (p[100])

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>

int main(void)
{
int a = 1;
int b = 2;
int c = 3;
int d = 4;
int e = 5;
int *p[5] = {&a, &b, &c, &d, &e};
int i;
for (i = 0; i < 5; i++)
{
printf("%d ", *p[i]);
}
putchar('\n');
return 0;
}

数组指针

还是按照 上面 指针数组的推理: 指针也是有很多种类型的,如 int * p,说明这个 指针p指向 指向整型的内存,那数组指针呢? 我们可以重新理解为 这个指针是指向数组类型的, 数组指针的写法和指针数组很像,就是多了个括号

1
2
int a[3] = {1, 2, 3};
int (*pa)[3] = &a;

pa 是指向 数组a[3] 的指针 , int (*pa)[3] 是挺难理解的 , 我的理解是 *()和[ ] 是相同的优先级,现在是从左到右开始结合 int 代表着 p指向的内容是整型的,[3] 是说明有3个这样的空间

函数指针

函数即我们写的代码,代码也有有专门存放的空间,从内存布局上看,是存放在代码区,所以也是有地址的! 通过 函数名可以找到 代码块的地址

同数组指针一样的理解, 这个这个指针的类型是函数的(有点拗口,但还是抽象的形容吧) ,函数回调就可以用函数指针来实现

1
2
3
int Func(int, int);;   /*声明一个函数*/
int (*p) (int, int);; /*定义一个函数指针*/
p = Func; /*将Func函数的首地址赋给指针变量p 不用 & 符号*/

p是一个指针,返回的值是 整型的,后面 (int, int) 是函数的参数
这个规律是 返回值要相同,形参也要一致

函数指针数组

同上,这个数组的类型是 函数指针类型的,数组中的每一项都保存这个一个函数指针

1
int (*p[10])();

p和 [10]相结合 有了个数组,然后和 * 结合 是个指针数组,和 int 结合 ,返回的值是 int 类型的, 然后和 () 就是形参列表

指针函数

这个不用说都明白的了,函数 返回值是 指针类型的

1
int *fun(int x, int y);

待更新