指针数组和数组指针
指针 ,数组, 函数 这个概念并不会陌生,但是组合起来 就有很多含义,总是搞混,如 数组指针 ,数组指针 ,函数指针等等... 死记硬背是不可能的,在这里总结下规律==
指针数组
这个比较容易理解 ,我们日常使用的数组有 整型的数组,如 int a\[100\]; 有100个空间,里面都是存放整型变量的 , 也有浮点型的数组 float b\[100\]; 从前两个可以总结出这一类数组叫法都是 类型名 \+ 数组 , 我们也知道 指针也是类型! 只不过是比较特殊的类型(存地址)! 所以说 指针数组是存在指针的数组,那如何标识呢?
int \p\[100\] —-> int \ (p\[100\])
#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指向 指向整型的内存,那数组指针呢? 我们可以重新理解为 这个指针是指向 数组类型 的, 数组指针的写法和指针数组很像,就是多了个括号
int a[3] = {1, 2, 3};
int (*pa)[3] = &a;
pa 是指向 数组a\[3\] 的指针 , int (\pa)\[3\] 是挺难理解的 , 我的理解是 \ _()和\[ \] 是相同的优先级,现在是从左到右开始结合 int 代表着 p指向的内容是整型的,\[3\] 是说明有3个这样的空间_
函数指针
函数即我们写的代码,代码也有有专门存放的空间,从内存布局上看,是存放在代码区, 所以也是有地址的! 通过 函数名可以找到 代码块的地址
同数组指针一样的理解, 这个这个指针的类型是函数的(有点拗口,但还是抽象的形容吧) ,函数回调就可以用函数指针来实现
int Func(int, int);; /*声明一个函数*/
int (*p) (int, int);; /*定义一个函数指针*/
p = Func; /*将Func函数的首地址赋给指针变量p 不用 & 符号*/
p是一个指针,返回的值是 整型的,后面 (int, int) 是函数的参数
这个规律是 返回值要相同,形参也要一致
函数指针数组
同上,这个数组的类型是 函数指针类型的,数组中的每一项都保存这个一个函数指针
int (*p[10])();
p和 \[10\]相结合 有了个数组,然后和 \* 结合 是个指针数组,和 int 结合 ,返回的值是 int 类型的, 然后和 () 就是形参列表
指针函数
这个不用说都明白的了,函数 返回值是 指针类型的
int *fun(int x, int y);
待更新