飞道的博客

C语言进阶之旅(11)指针进阶上 精华篇

467人阅读  评论(0)

     写个感想吧,不知不觉又过了一个月,学C语言已经过了俩个月,博客也有一搭没一搭的更新着,虽然不知道写的文章对别人是否有帮助,或许有吧,比较还有人给我点赞呢哈哈哈,OK我会继续输入(听课看书写作业)输出的(写博客)


思维导图


本次内容大致是这些,笔墨重在二维数组和函数

指针

  • 先学新的东西的时候先回忆一下之前的知识吧初级指针
  • 以及操作符优先级复习操作符
  • 本文图解居多

一维数组

  • 数组指针
  • 指针数组

数组指针是啥?指针数组又是啥?咋长的怎么像双胞胎吗

指针数组

  • 这个概念我之前在初级的时候其实说过,不过再说一遍一无妨
  • 写法{int * arr[]},这里有一个优先级的问题,arr先和方括号结合代表他是数组,里面的元素是int*
  • 我就举一个例子:社团(社团可以说是和一群爱好差不多,兴趣也差不多,就是一类人)
  • 你看整型和整型一起玩可以形成一个团体,字符型和字符型一起玩也可以形成一个社团,那我指针凭什么不可以和指针一起玩对吧
  • 但是如果别的兴趣爱好不一样的来你社团尬聊咋办,当然不欢迎,一句话我和你没有共同的语言

数组指针

  • 这个就是指向数组的指针,也就是存放数组的指针
  • 写发{int* (*p)arr[数组元素个数]},括号的优先级比方括号高,所以他先和 *结合,然后在和方括号
  • 栗子
  • 大致和上面那种感觉一样,他就像是社团的辅导员,管理着这个社团,还可以给同学们分配任务哈

数组指针和指针数组的代码

int main()
{
   
	int arr[] = {
    1,2,3,4,5,6 };
	int brr[] = {
    2,3,4,5,6,7 };
	int crr[] = {
    3,4,5,6,7,8 };
	int* pa = arr;
	int* pb = brr;
	int* pc = crr;
	int* drr[3] = {
    pa,pb,pc };
	int*(*pd)[3] = drr;

	return  0;
}

二维数组

  • OK既然是男一号那就要重点关照关照🤩

二维数组的基本概念

  • 介绍emmm,好吧之前我没写,不过没关系,贿赂朋友的数组博客
  • 二维数组的首元素地址其实就是第一行
  • 二维数组的是啥样的,其实和一位数组没啥不同
    看图
    一般访问数组都是用都是用[]来访问的

二维数组指针

  • 数组的地址<>数组名<>数组首元素地址
  • 二维数组和一维数组一样,数组名就是数组的地址,但是他不一样的是他的首元素的地址是第一行
  • 把他看成一维数组,他只有三个元素,一行就是一个元素

那么他如何存到指针里面呢?

  1. 先看一下一维数组的指针 int *p =b,(这里是p指向的是一个int类型数据,他有4字节那么大的内存单元)
  2. 那么我们如果来存二维数组那可以存下吗?
  3. 看个图
  • 看到这里你就知道不可以,二位数组的一个元素是一列,那么他的指针应该也是大小可以存下那么多那么
  • 那么看下他怎么写
  • 这里涉及到了优先级
int (*p)[4]

  • 那么这样就可以存下二维数组例子
    这样是不是就可以存下这个二维数组
    他的一列三个元素,每个元素是int,就是12个字节,这个指针3*类型(int=4)也是12

访问二维数组的方式

  • 方括号来访问(下标引用操作符),这个都会不介绍了
  • 一维数组方式
  • 二维数组的形式

一维度数组的形式

  • 都知道一维数组和二维数组存储一样都是从低到高连续存放的
  • 那位只要拿到他的的首元素地址我就可以用一维数组的方式来访问二维数组
  • 同样是优先级在作怪
int arr[3][3]={
   {
   1,2,3},{
   4,5,6},{
   7,8,9}};
int *p=&arr[0][0];
p++//这样就可以找到数组里面的全部元素

图解:

二维数的形式来对数组访问

  • int (*p)[],这个一个二维数组的指针
  • 那么他怎么访问数组呢
  • 看代码有解析
int arr[3][3]={
   {
   1,2,3},{
   4,5,6},{
   7,8,9}};
int (*p)[3]=arr;

图解:

  • 1
  • 2

函数指针

  • 自定义函数,也会在栈上开辟一块空间
  • 那么存子内存中,那么他一定有地址
  • 有地址就可以存起来


    看看怎么把函数的地址符给指针:

拓展写法:

int add(int x,int y)
{
   
return x+y;
}
int (*p)() = add;
	int (*p2)() = &add;
	printf("%p\n", p);
	printf("%p",p2);

调用函数指针:

  • 看看函数指针如何调用


  • 这里的*是可以省略的作用大致就是告诉你他是指针
int add(int x,int y)
{
   
return x+y;
}
int main()
{
   
 int (*p)() = add;
	int (*p2)() = &add;

	printf("%d\n", add(8, 5));
	printf("%d\n",(*p)(8, 5));
	printf("%d\n", p(8, 5));
   
}

输出结果

函数指针数组

  1. 写法void(*p[])(int)
  2. 作用就是存放参数一样,返回类型一样的指针
  3. 写一个通俗的例子:

他里面放的是函数地址,用的时候用下标找到这个函数然后直接转移(转移表),感觉类似虫洞一样的感觉,或者从我们的平行世界到了另一个平行世界的感觉

  • 案例(下篇)
  • 计算器

函数数组指针

  1. void( *(*p)[]) (int )
  2. 存函数数组的指针

3 . 指向函数指针数组的指针是一个指针 指针指向一个数组,数组的元素都是函数指针

回调函数

  • 就是一个A函数的参数是B函数的返回值,a会根据b的返回值进行不同的操作
  • 例子 1:

A函数通过b函数地址找到b函数,然后操作
例子:
(必须是同类型的)


👧给自己所住的位置给👦,说晚上过来唠嗑,然后通过地址找了👧的家


明天👧吧学习地址给了👦,也说下午过来学习,那么他又过去了

  • 栗子2

变形金刚说法:
我=主函数
张三=A函数
李四=B函数
 1. 我想要去参加赛博坦参加大战,可是我没有机车人

 2.所以我叫张三你个我造个机车人,然后他收集零件,零件全部都找齐了,可是张三不会组装,

 3. 然后他就去找了李四,李四会,可是李四造成什么样,就会有不同的机车人

  • 案例(下篇)
  • qsort模拟实现

拓展

  • qsort是c语言的库函数,可以用来排序任何类型的变量
  • 他是在冒泡排序的基础上进行的
  • 下面是他的用法

分享最近看到一句话

  • 我不笨,也不聪明,我只是很勤奋吧了!!!
                                                                  -于敏先生

有错请直接指出,评论区,私信或qq(1696912943)


持续更新………………
转载:https://blog.csdn.net/Legwhite/article/details/117485471
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场