指针数组,数组指针,指针函数(模拟计算器+,-,*,/)

指针数组和数组指针

  1. 指针数组的实质就是一个数组,这个数组中存储的内容全部是指针变量
  2. 数组指针的实质是一个指针,这个指针指向的是一个数组。
    (1) int *p[]; int(*p)[b];int *(p[b]);
    (2) 一般规律:int p(p是一个指针); int p5
    总结:定义一个符号时,关键在于:首先要搞清楚你定义的符号是谁(第一步:找核心)
    其次再次看谁和核心最近,谁和核心结合(第二部:找结合)
    以后继续向外扩张(第三步:继续向外结合直到整个符号)
    (3) 如何核心和
    结合,表示核心是指针,如果核心和[]结合,表示核心是数组,如果核心和()结合,表明核心是函数。
    (4) 用一般规律来分析3个核心符号:
    第一个:int *p[5];
    注意:符号的有算计到底有什么作用?其实是决定当2个符号一起作用的时候决定哪个符号先运算,哪个符号后运算。

先和数组结合,所以可以看到是一个指针数组。
P是一个数组,数组有5个元素大,数组中的元素都是整个符号是一个指针数组。
第二个:int (*p)[5];
()是一个强制执行
核心是p, p是一个指针,指针指向一个数组,数组有5个元素,数组中存的元素是int类型,总结一下,就是一下整个符号的意义就是数组指针。
第三个:int *(p[5]);
这里()和上面第一个是一样的,()对于这个作用不大,因为本身就是先和[]结合,即使不加()还是先和[]结合,因此与第一种是一样的。
找到核心后从内到外逐层结合
基础理论和原理则是关键,没有无缘无故的规则。

函数指针
函数指针
函数指针实质(还是指针)
(1)本身还是4个字节(在32位系统中,所有的指针都是4个字节)
(2)函数指针、数组指针、普通指针之间并没有本质区别,区别在于指针指向的东西是什么。
(3)函数的实质是一段代码,这一段代码在内存中是连续分布的(一个函数的大括号括起来的所有语句将来编译出来生成的可执行程序是连续的),所以对于函数来说很关键的就是函数中的第一句代码的地址,这个地址就是所谓的函数地址,在C语言中用函数名这个符号来表示。
(4)结合函数的实质,函数指针其实就是一个普通变量,这个普通变量的类型是函数指针变量类型,它的值就是某个函数的地址(也就是它的函数名这个符号在编译器中对应的值)

函数指针的书写和分析方法

  1. C语言本身就是强类型语言(每一个变量都有自己的变量类型),编译器可以帮我们做严格的类型检查。

函数:void func(void);
对应的函数指针:void (p)(void);
类型是:void (
)();

函数名和数组名最大的区别就是:函数名做右值时不加&和加&效果时一样的,但是数组名做右值时加不加&的意义就不一样。
char *strcpy(char *dest, const char *src);

Typedef关键之的用法
(1) typedef是C语言中一个关键之,作用用来定义(或者叫做重命名类型)
(2) 一种是编译器的原生而理性(int , double)
一种用户自定义类型,不是语言自带的是程序员自己定义的(譬如数组类型、结构体类型,函数类型…)
以上所学都是用户自定义类型(指针数组,数组指针,函数指针)
Typedef给类型重命名,它重命名的都是一个类型,而不是变量。

函数指针实战演练:
用函数指针调用执行函数

指针函数(模拟计算器+,-,*,/)
#include<stdio.h>
#include <string.h>

// 定义一个类型pFunc,这个函数指针类型指向一种特定参数列表和返回值的函数
typedef int (*pFunc)(int ,int);

int add(int a, int b)
{
return a + b;
}

int sub(int a, int b)
{
return a - b;
}

int multiply(int a, int b)
{
return a * b;
}
int divide(int a, int b)
{
// char d = ‘error’;
if (b == 0)
return 0;
else
return a / b;
}

int main(void)

{
pFunc p1 = NULL;
char c = 0;
int a = 0, b = 0;
printf(“请输入操作类型:+ - * /:”);

scanf( "%c",&c);
switch(c)
{
	case '+':
		p1 = add; break;
	
	case '-':
		p1 = sub; break;
	
	case '*':
		p1 = multiply; break;
	
	case '/':
		p1 = divide; break;
	
	default:
		p1 = NULL; break;
}
printf("请输入两个整数:");
scanf("%d%d",&a,&b);
int res = 0;
res = p1(a, b);
printf("%d %c %d = %d.\n",a, c, b, res);


return 0;

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值