[朝花夕拾C语言]:指针的进阶学习

阅读: 评论:0

[朝花夕拾C语言]:指针的进阶学习

[朝花夕拾C语言]:指针的进阶学习

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

前言

一、指针到底是个啥呢?

二、指针进阶后的学习:

2.1 函数指针的应用

2.2 函数指针数组的使用

总结


前言

提示:这里可以添加本文要记录的大概内容:

       对于C语言来讲,好多人都认为指针是C语言的灵魂,根据小菜鸡我的最近学习,确实的的确确的感受到了来自C语言指针的折磨与坎坷,指针它就在那里,你学与不学,它依然在。

       也许和好多人都在讲:当你精通C语言的指针后,这就是10w和30w的差别,虽然有点夸张,但是确实现在的社会就是这样,会就是生产力,不会,你就卷铺盖滚蛋吧!


提示:以下是本篇文章正文内容,下面案例可供参考

一、指针到底是个啥呢?

到现在为止,我认为:指针是用来表示内存地址的一个代号,对,就是一个代号而已,也许只是好多人被后面的知识点的复杂给害怕了! 它:就是一个表示内存地址的工具而已!

int main()
{int a =10;int* p=&a;*p=20;printf("%d",*p);printf("%d",a);rerturn 0;
}

就比如现在这个代码,好多同学刚开始接触到C语言的指针,都是这种很简单的形式接触到的,感觉也没有这么难嘛!以为就这,对哈 ,单单就这样的难度,还真是就这而已!

下面简单说下:用学过的知识点类比一下数组指针

int main()
{//字符指针char ch = 'w';char* p = &ch;const char* p2 = "abcdef";//指针的数组-数组-存放指针的数组int* arr[10];char* ch[5];//数组指针int* p3;//指向整型的指针char* p4;// 字符的指针int arr2[5];//数组int(*pa)[5] = &arr2;//数组的指针,return 0;}

二、指针进阶后的学习:

对于这块内容,小菜鸡本人跟着学习了好几天感觉一直在慢慢的绕着,本来不想写博客,但是真的是学而不思则罔,感觉还是有必要慢慢试着把一天学习的知识点,给好好记录下来啊!

对于下面的 1.数组  2.指针数组  3.数组指针  4.函数指针 5.函数指针数组 肯定也有好多小伙伴跟我一样也是傻傻的分不清,我也想把自己的理解分享给大家;

int main()
{int arr[10];//数组:含有10个元素的整型数组int* pa[10];//指针数组:pa是数组的名字,里面有10个元素,int*表示的是指向整型的指针int(*pb)[10];//数组指针:(*pb)两个优先结合,表明是该类型是个指针,元素是10个, 指向的类型是整型为intint(*pc)(int x ,int y);//函数指针:(*pc)该类型是个指针,后面调用的参数为(int x,int y)最后的返回类型为int类型   int(*pf[4])(int x ,int y);//函数指针数组:(*pf[4])是一个有4个元素的指针数组,调用的参数为(int x,int y),最后的返回类型为int类型return 0;
}

2.1 函数指针的应用

对于函数指针的使用 ,通过调用函数指针可以很方便的实现需要的功能:

void print(char* str)
{printf("%sn", str);}
int main()
{void (*p)(char*) = print;//调用相应的print函数进行打印//*p 是指针 指向的函数类型是char* 返回类型为void(*p)("hehe");return 0;
}

最后结果打印出来是:

test
hehe:bit

我们简单来分析一下:这里的*p 是指针,指向的函数类型是char* ,返回类型为void,当(*p)使用时调用print函数,print括号里面的参数是一个字符,类型是char*,组的使用

2.2 函数指针数组的使用

对于函数指针数组,这个工具用起来可以更好的帮助我们减少代码的书写:代码是用来运行的,不是用来堆叠的!

#include <stdio.h>
#include <string.h>int add(int x, int y)
{return  x + y;
}
int sub(int x, int y)
{return  x - y;
}
int mul(int x, int y)
{return  x * y;
}
int div(int x, int y)
{return  x / y;
}
int main()
{int (*parr[4])(int, int) = {add,sub,mul,div};//add-1 sub-2 mul-3 div-4int i = 0;for (i = 0; i < 4; i++){printf("%dn",parr[i](6, 3));// 根据指针找到相应的地址//进行相应的加减乘除的运算!}return 0;
}

这行代码:int (*parr[4])(int, int) = {add,sub,mul,div};//add-1 sub-2 mul-3 div-4 其实主要是将后面的加减乘除通过一个函数指针数组全部放在一起,正如我们上面讲的:int(*pf[4])(int x ,int y);//函数指针数组:(*pf[4])是一个有4个元素的指针数组,调用的参数为(int x,int y),最后的返回类型为int类型,我们后面只需要找到对应的【i】的值,就能通过找到函数的地址,来调用函数,来实现应用。

再比如说,我们可以换种方式对加减乘除进行优化:

void menu()
{printf("**********************n");printf("*1.add    2.sub*******n");printf("*3.mul    4.div*******n");printf("*5.xor    0.exit  ****n");printf("**********************n");
}
int add(int x, int y)
{return x + y;
}
int sub(int x, int y)
{return x - y;
}
int mul(int x, int y)
{return x * y;
}
int div(int x, int y)
{return x / y;
}
int xor (int x, int y)
{return x ^ y;
}void clc(int (*pf)(int x, int y))//仍然是使用其相应的函数指针的知识!
{int x = 0;int y = 0;printf("请输入两个操作数:>");scanf("%d%d", &x, &y);printf("%dn", pf(x, y));}
int main()
{int input = 0;do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:clc(add);break;case 2:clc(sub);break;case 3:clc(mul);break;case 4:clc(div);break;}} while (input);return 0;
}

我们可以通过封装函数clc(add/sub/mul/div)里面的其中一种就可以进行调用,而void clc(int (*pf)(int x, int y))//仍然是使用其相应的函数指针的知识!利用(*pf)作为指针,参数类型为(int x,int y)返回值为void,在使用指针的时候也同时调用其余的四个函数进行运算!

总结

提示:这里对文章进行总结:
上面介绍了:1.数组 2.数组指针 3.指针数组 4.函数指针 5.函数指针数组 的基本概念和应用,第一篇博客刚刚开始写,还有好多不熟练,希望后面,能给大家创作出更多优质的文章,谢谢!2022年5月31号 人才公寓隔离点书写!

本文发布于:2024-02-03 23:19:04,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170697367451513.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:进阶   朝花夕拾   指针   语言
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23