C语言学习笔记——指针(三)

1 字符指针

字符指针是指向字符型变量的指针,它在不同情况下,使用也会有所不同
第一种情况:

int main()
{
	char c = 'a';
	char* pc = &c;
	return 0;
}

在这里定义了一个字符变量 c 并赋值为 ‘a’ ,使字符指针 pc 指向了它
图示:
在这里插入图片描述
第二种情况:

int main()
{
	char str[] = "abcdef";
	char* p = str; //str为数组名,没有Sizeof, &, 是首元素地址
}

这里定义了一个字符数组 str ,它通过常量字符串 “abcdef” 来进行赋值,使用 p 指向了 str 的首元素地址

在这里插入图片描述

第三种情况:

int main()
{
	char* pc = "abcdef";
}

这里定义了一个字符指针 pc ,使它指向了字符串 “abcdef” 的首元素,或称,保存了首元素的地址,而不是将字符串 “abcdef” 保存到了 pc 内部
图示:
在这里插入图片描述

由于 “abcdef” 是字符常量,所以是无法被更改的,如果要通过 * (解引用操作符) 操作指针对字符串进行修改,那么编译器会报错
示例:

int main()
{
	char* pc = "abcdef";
	*pc = 'w';
	return 0;
}

进行调试会出现如下错误:
在这里插入图片描述

2 函数指针

变量和数组都有指针,函数也得有自己的指针
既然函数也有指针,那么函数的地址怎么获得呢?
函数的地址,可以通过 &函数名 ,函数名 两个方式获得

2.1 函数指针的定义

示例:

#include <stdio.h>
int add(int x, int y)
{
	return x + y;
}
int main()
{
	printf("%p\n", &add); //&函数名
	printf("%p\n", add); //函数名

	return 0;
}

运行结果:
在这里插入图片描述

知道了怎么获得函数的地址,接下来说说函数指针该怎么写
直接上代码:

int add(int x, int y)
{
	return x + y;
}
int main()
{
	int (*pf) (int, int) = add;

	return 0;
}

在这里,定义了函数 add 与函数指针 pf
理解方式如图:
在这里插入图片描述

2.2 函数指针的使用

如果要通过函数指针来调用函数,可以在指针变量前加上 * (解引用操作符),也可以不加

示例:

#include <stdio.h>
int add(int x, int y)
{
	return x + y;
}
int main()
{
	int (*pf) (int, int) = add;
	printf("%d\n", pf(2, 3)); //不加* 调用
	printf("%d\n", (*pf)(2, 3)); //加* 进行调用
	return 0;
}

运行结果:
在这里插入图片描述
如果使用函数指针来调用函数,那么被调用的函数就被称为回调函数

3 函数指针数组

3.1 函数指针数组的定义

直接上代码:

#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 (*pfArr[4]) (int, int) = { add, sub, mul ,div }; //函数指针数组pfArr
	return 0;
}

如上方代码所示,定义了一个函数指针数组 pfArr ,里面保存了四个函数的地址,分别是add,sub,mul,div
函数指针数组定义的理解方式:
在这里插入图片描述

3.2 函数指针数组的使用

要访问函数指针数组的内容,只需要使用下标即可,调用对应函数时,若有参数则需要给入参数
示例:

#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 (*pfArr[4]) (int, int) = { add, sub, mul ,div };
	printf("%d\n", pfArr[0](4, 2));
	printf("%d\n", pfArr[1](4, 2));
	printf("%d\n", pfArr[2](4, 2));
	printf("%d\n", pfArr[3](4, 2));

	return 0;
}

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值