#include<stdio.h>
/**
* 指针数组与数组指针
* @return
*/
int main(){
/**
* 指针数组
*/
//指针数组,本质上是一个数组,不过这个数组是用于存放指针的数组
int a,b,c;
int * arr[3] = {&a,&b,&c}; //本质上还是数组,只不过存的都是地址
//因为数组中全都是指针,比如我们现在想要访问数组中第一个指针指向的地址
*arr[0] = 100; //[]运算符的优先级更高,所以这里先通过[0]取出地址,然后再使用*将值赋值到对应的地址上
printf("%d\n",a);
//当然,我们也可以用二级指针变量来得到指针数组的首元素地址
int* p[3]; //因为数组内全是指针
int** pp = p; //所以可以直接使用指向指针的指针来指向数组中的第一个指针元素
printf("——————————————————————————————————————————————————————————————————————————————\n");
/**
* 数组指针
*/
//数组指针,本质上是一个指针,不过它是一个指向数组的指针(注意,它的目标是整个数组,和我们之前认识的指针不同,之前认识的指针是指向某种类型变量的指针)
//int* p; 指向int类型的指针
//int (*p)[3]; //注意这里需要将*p括起来,因为[]优先级更高
//注意它的目标是整个数组,而不是普通的指针那样指向的是数组的首个元素
int brr[3] = {111, 222, 333};
int (*q)[3] = &brr; //直接对整个数组再取一次地址(因为数组指针代表的是整个数组的地址,虽然和普通指针都是指向首元素地址,但是意义不同)
printf("%d, %d, %d\n", *(*q+0), *(*q+1), *(*q+2)); //要获取数组中的每个元素,稍微有点麻烦
/**
* q代表整个数组的地址
* *p表示所指向数组中首元素的地址
* *p+i表示所指向数组中第`i`个(0开始)元素的地址(实际上这里的*p就是指向首元素的指针)
* *(*p + i)就是取对应地址上的值了
*/
printf("%p\n",q);
printf("%p\n",*q);
}
#include<stdio.h>
/**
* 指针函数与函数指针
* @return
*/
//函数可以返回一个指针类型的结果,这种函数称为指针函数
int* test(int* a){ //函数的返回值类型是int* 指针类型的
return a;
}
//函数指针
int sum(int a,int b){ //这个函数实现了a + b
return a+b;
}
//有了函数指针,我们就可以编写函数回调了(所谓回调就让别人去调用我们提供的函数,而不是我们主动来调别人的函数),
//比如现在我们定义了一个函数,不过这个函数需要参数通过一个处理的逻辑才能正常运行
int sum2(int (*p)(int, int), int a, int b){ //将函数指针作为参数传入
//函数回调
return p(a, b); //就像你进了公司然后花钱请别人帮你写代码,工资咱们五五开,属于是直接让别人帮你实现
}
int main(){
//指针函数
int a = 100;
int* p = test(&a); //使用int* 指针类型去接受返回值
printf("%p\n",p);
printf("%d\n",*test(&a));
//函数指针
int (*q)(int,int) = sum;
printf("%p\n",q); //这样我们就拿到了函数的地址
//接下来,通过函数指针调用函数
int result1 = (*q)(1,2);//就像我们正常使用函数那样,(*p)表示这个函数,后面依然是在小括号里面填上实参
int result2 = q(1, 2); //当然也可以直接写函数指针变量名称,效果一样
printf("%d = %d", result1,result2);
int (*t)(int, int) = sum; //拿到实现那个函数的地址
printf("%d", sum2(t, 10, 20));
}