进阶指针 (一)

指针进阶(一)

前言:

很遗憾之前写博客的平台一直摇摆不定,之前有试过在CSDN写,然后也跑去过51CTO写,个人感觉,对于新手,51cto是不太友好的!因为它算是一个比较小众的技术博客,里面的大神较多。所以沉沉浮浮的我,最后下定决心的回来了CSDN写博客

一 、指针是什么

我们通常说的指针是指针变量:指针变量就是一个变量,就是一块内存空间,用来存储地址的。

在这里插入图片描述

二 ## 标题、指针类型的意义

  1. 指针的类型决定了指针进行解引用操作时,能够访问空间的大小。
char ch = 'a';
//字符串指针进行解引用操作时只能访问一个字节的空间
char * pc = &ch;
int a = 10;
//整形指针进行解引用操作时能访问四个字节的空间大小
int * pa = &a;
  1. 指针类型决定了指针‘+ , -’整数时,指针跳过几个字节(步长)。
int * p ;
p + 1;//向后跳过四个字节
char * pc ;
pc + 1;//向后跳过一个字节

在这里插入图片描述

三 、指针数组

指针数组:本质上是数组,只不过数组中存储的元素是指针(元素)。

int * pa;
int * pc;
int * pb;
int * arr[3] = { pa, pc, pb};//整形指针数组

四 、数组名是什么

大多数情况下,数组名是数组首元素的大小,但是又两种情况例外;

  1. sizeof(数组名),这个求得是整个数组的大小,单位
    是字节(byte)
  2. &数组名,这个取出的是整个数组的地址。
int arr[4] = {1,2,3,4};
int ret = sizeof(arr);//这个求得是数组的大小,单温字节
int (*parr)[4] = &arr;//parr是数组指针,这个数组有四个元素,每个元素的类型是int,&arr,取出的是整个数组的地址。

五 、数组指针

数组指针:顾名思义就是一个指针,只不过它指向对象是数组。

int arr[3] = {1,2,3};
int (*parr)[3] = &arr;//parr是数字指针,指向对象是数组,这个数组有3个元素,元素的类型是int。parr的类型是 int (*)[3];

六 、 函数指针

函数也是有地址的,进而有了函数指针。函数指针:本质上是指针,只不过指针指向的对象是函数。

void Add (int x , int y )
{
    return x + y;
}
int main()
{ 
    int x = 3; 
    int y = 4;
    int ret = Add(x, y);
    int (*padd)(int , int) = &Add;//这里有没有&都行,因为函数名就是函数的地址
    //调用函数有两种方法,一种是通过函数来调用,另外一种是通过函数指针来调用
    printf("%d\n", (*padd)(5, 20));//这里*可以不用,
    
}

在这里插入图片描述

七 、函数指针数组

函数指针数组:本质上是数组,数组的元素类型是函数指针。

#define _CRT_SECURE_NO_WARNINGS  
#include<stdio.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[5])(int, int) = { &Add, &Sub, &Mul, &Div };
	return 0}

八 、函数指针数组的实例应用

做一个计算器模型,我们有很多方法来做,但是在开发的过程中,我们尽可能的选用,逻辑清晰,代码量少,容易看懂的,下面我们将用函数指针数组来实现计算器模型:

#define _CRT_SECURE_NO_WARNINGS  
#include<stdio.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;
}
void test()
{
	printf("##################\n");
	printf("##### 0 exit #####\n");
	printf("##### 1 add  #####\n");
	printf("##### 2 sub  #####\n");
	printf("##### 3 mul  #####\n");
	printf("##### 4 div  #####\n");
}
void caclu(int input)
{
	printf("请输入两个操作数\n");
	int (*parr[5])(int, int) = { 0, &Add, &Sub, &Mul, &Div };
	int x = 0; 
	int y = 0;
	scanf("%d%d", &x, &y);
	printf("%d\n",(*parr[input])(x, y));

}
int main()
{

	int input = 0;
	while (1)
	{
		do
		{
			test();
			printf("请选择你的执行程序/>:");
			scanf("%d", &input);
			switch (input)
			{
			case 0:
				printf("退出程序!\n");
				break;
			case 1:
				printf("加法程序!\n");
				caclu(input);
				break;
			case 2:
				printf("减法程序!\n");
				caclu(input);
				break;
			case 3:
				printf("乘法程序!\n");
				caclu(input);
				break;
			case 4:
				printf("除法程序!\n");
				caclu(input);
				break;
			default :
				printf("你的输入有误,请重新输入!\n");
				break;
			}

		} while (input);
		if (input == 0)
		{
			break;
		}
	}
	return 0;
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小刘家的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值