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

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

前言

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

       对于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号 人才公寓隔离点书写!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值