Administrator
发布于 2022-04-02 / 6 阅读
0
0

指针数组和数组指针

指针数组和数组指针

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

指针数组

这个比较容易理解 ,我们日常使用的数组有 整型的数组,如 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);

待更新


评论