提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
对于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个,
指向的类型是整型为int
int(*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("%s\n", 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-4
int i = 0;
for (i = 0; i < 4; i++)
{
printf("%d\n",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("%d\n", 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号 人才公寓隔离点书写!