深入了解指针(part3)(数组指针,函数指针,函数指针数组实现转移表)

本文详细探讨了字符指针的奇特之处、特殊使用方法,以及常量字符串与字符指针的区别。还介绍了数组指针的概念、表示二维数组传参的方式,以及函数指针和函数指针数组的应用,最后展示了如何用函数指针数组实现转移表功能。
摘要由CSDN通过智能技术生成

1.字符指针变量中的奇特之处

1)一般字符指针:

char ch = 't';
char* p1 = &ch;
*p1 = 'w';
printf("%c", ch);
return 0;

2)特殊使用方法:这里注意使用的是p1而不是&p1,p1指的是‘d’,而&p1是以外的p1的地址

const char* p1 = "daer K";
printf("%s", p1);

这里看是把一整个字符串传给字符指针,实际上是把字符串的首元素的地址传递

3)常量字符串的用法和字符指针的区别

const char* p1 = "hello";
const char* p2 = "hello";
char p3[] = "str";
char p4[] = "str";
if (p1 == p2)printf("Yes1\n");
else printf("No1\n");
if (p3 == p4)printf("Yes2\n");
else printf("No2\n");
return 0;

原因:因为p1,p2指向的相同,计算机没必要创建两个相同的字符串,所以把他两储存到一起

但char 内的内容也许会改变,两个p3 p4指的空间不一样,所以不同

2.数组指针

定义:本质是指针,表示的是存放的是数组的地址,能够指向指针的变量,用于存放数组的地址

形式:int (*p)[ ];

用法:

int a[10] = { 0 };
int(*p)[10] = &a;

把数组的的地址存放在指针变量内(注意一点:数组指针的数字要和数组的数字一样)

例子:

int a[3] = { 1,2,3 };
int(*p)[3] = &a;
for (int i = 0; i < 3; i++)
{
	printf("%d ", (*p)[i]);
}
return 0;

解释:这里(*p)[i]表示a[i]

结果:

3.数组指针表示二维数组传参本质

例子:用数组指针接受数组地址

void douzu(int(*p)[4], int sz, int len)
{
	for (int i = 0; i < sz; i++)
	{
		for (int j = 0; j < len; j++)
		{
			printf("%d ", *((*p + i)+j));//解释这里(*p)+i表示找到a[i][],*((*p + i)+j)表示找到a[i][j];
		}
		printf("\n");
	}
}
int main()
{
	int a[2][4] = { {1,2,3,4},{2,3,4,5} };
	douzu(a, sizeof(a) / sizeof(a[0]), 4);
}

结果:

4.函数指针

定义:用于存放函数地址的指针

形式:int (*p)(  ,  );

函数指针的调用:

int Add(int a, int b)
{
	return a + b;
}
int main()
{
	int a = 3; 
	int b = 4;
	int (*p)(int, int) = &Add;//这里&可写可省略
	int r = (*p)(a,b);
	printf("%d", r);
}

运行结果:

加解:(*p)接可以理解为Add,(*p)(a,b)就可以认为是Add(a,b),与正常的函数调用一样

5.函数指针数组

定义:与指针数组类似,唯一不同的是数组里存放的是函数的地址

形式:int (*p[])(  ,  );

与函数指针不同的是,加了个[ ],到时候调用的时候用(*p)[ ]即可

代码实现:

int Add(int a, int b)
{
	return a + b;
}
int Del(int a, int b)
{
	return a - b;
}
int main()
{
	int a = 3; 
	int b = 4;
	int (*p[2])(int, int) = { Add,Del};//这里&可写可省略
	int r = (*p[0])(a, b);
	int h = (*p[1])(a,b);
	printf("%d %d", r,h);
}

结果展示:

4.用函数指针数组实现转移表

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void menu()
{
	printf("********************************\n");
	printf("********************************\n");
	printf("*******请输入数字:       ******\n");
	printf("******1.加法 2.减法*************\n");
	printf("******3.乘法 4.除法*************\n");
	printf("********************************\n"); 
	printf("********************************\n");
}
int Add(int a, int b)
{
	return a + b;
}
int Dele(int a, int b)
{
	return a - b;
}
int Mul(int a, int b)
{
	return a * b;
}
int Div(int a, int b)
{
	return a / b;
}
int main()
{
	int ((*p[5])(int,int) )= {0, Add,Dele,Mul,Div };
	menu();
	do {
		int n = 0;
		printf("请输入数字:");
		scanf("%d", &n);
		int a = 0;
		int b = 0;
		printf("请输入两个整数:");
		scanf("%d%d", &a, &b);
		if (n >= 1 && n <= 4) {
			int r = (*p[n])(a, b);
			printf("%d\n", r);
		}
		else if (n == 0)
		{
			printf("退出计算器\n");
			break;
		}
		else
		{
			printf("输入错误,请重新输入\n");
		}
	} while (1);
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值