C语言——指针(四)

本文详细介绍了C语言中字符指针、数组指针和函数指针的特点,包括它们的使用方法、存储机制以及在面试中的常见应用,通过实例解析了字符串、数组地址和二维数组传参的本质。
摘要由CSDN通过智能技术生成

📝前言:
上篇文章C语言——指针(三)指针和数组进行了讲解,今天主要更深入的讲解一下不同类型指针变量的特点
1,字符指针变量
2,数组指针变量
3,函数指针变量

🎬个人简介:努力学习ing
📋个人专栏:C语言入门基础
🎀CSDN主页 愚润求学
🌄每日鸡汤:想去的地方,敲两次门又何妨


一,字符指针变量(char*)

1,一般使用

👇🏻

int main()
{
   char ch  = 'a';
   char *pc = &ch; //把ch的地址赋值给pc
   *pc = 'a';     //把‘a’赋值给pc所指向的空间
   return 0}

2,储存字符串

那么字符串又该如何用字符指针来储存呢?
请看下面的代码👇🏻:

int main()
{
	const char* pc = "hello bit";
	printf("%s\n", pc);
	return 0;
}

对于第一行代码:const char* pc = “hello bit”;
难道这里是把整个字符串储存到pc指针变量里了吗?

答案是:错误!

真正存入pc指针变量的是“hello bit”的第一个字符‘h’的地址
这是因为:
当常量字符串出现在表达式中的时候,它的值是第一个字符的地址

我们都知道数组中**首地址[下标]**的形式可以实现对元素的查找,其实字符串也可以用同样的形式来查找字符串中的内容。

因为:字符串在内存中也是连续储存的,所以,我们可以把字符串理解成:一个内容不能被修改的字符数组
并且**表达式中的整个字符串的值是第一个字符的地址!!!**

我们可以验证一下👇🏻:
在这里插入图片描述
就如上面图片所展示的,以pc为首地址,找到了下标为0的字符‘h’和下标为3的字符‘l’

3,面试题

下面有一道典型的题目,可以加深我们的理解:
请看下面这段代码👇🏻,思考输出结果

int main()
{
	char str1[] = "hello bit.";
	char str2[] = "hello bit.";
	const char* str3 = "hello bit.";
	const char* str4 = "hello bit.";

	if (str1 == str2)
		printf("str1 and str2 are same\n");
	else
		printf("str1 and str2 are not same\n");
	if(str3 == str4)
		printf("str3 and str4 are same\n");
	else
		printf("str3 and str4 are not same\n");
	return 0;
}

结果是👇🏻
在这里插入图片描述

解释(逐步分析):
对变量进行理解:
1,这里的str1和str2是两个不同的字符数组,但是存放的内容都是:“hello bit.”
2,str3和str4是两个字符变量,表达式中的“hello bit”的值是首字符的地址,所以str3和str4中存放的都是‘h’的地址
对表达式的意义进行理解:
1,**if(str1 == str2)**中,str1代表的是str1数组中首元素的地址,str2代表的是str2数组中首元素的地址,所以,这个表达式比较的是两个数组首元素的地址是否相同
2,**if(str3 == str4)**中,因为str3和str4都是字符指针,是两个变量,所以,这个表达式比较的是两个变量里面的值是否相同
虽然,str1与str2两个字符数组的内容相同,但是两个字符数组所占用的内存是不同的,所以两个数组的首元素的地址也不同,所以str1!=str2
对于str3和str4而言,两个变量储存的都是同一份“hello bit”中’h’的地址,所以两个变量的内容是相同的,即:str3==str4

二,数组指针变量

1,识别数组指针

数组指针变量就是用来存放数组的地址,能够指向数组的指针变量
我们来看下面哪个是数组指针(注意看类型):

int *p1[10];
int (*p2)[10]

答案:
p1是:数组里有十个元素,每个元素的类型是int*的指针数组
p2是:指向数组,这个数组有十个元素,每个元素的类型是int的数组指针

解释:
在这里我们要注意符号结合的优先级:[]的优先级高于*号
1)p1先与[10]结合→构成一个有10个元素的数组,数组的类型为int*
2)p2在()的限制下,先与*号结合构成指针,指向的是有十个元素的数组,数组的类型是int

下图是数组指针类型的解析:
在这里插入图片描述

2,数组指针的初始化

和其他类型的变量初始化相似,只需给变量赋一个符合类型的值就行了
例如👇🏻,我们用&来得到数组的地址,然后再赋值给数组指针:

int arr[10] = {0};
int(*p)[10] = &arr;
//这样我们就通过&arr得到了数组的地址,然后复制给了p指针变量

3,二维数组传参的本质

趁热打铁:学习了数组指针,我们再来看看与其有关的二维数组的传参本质
我们都知道:
1,二维数组可以看成每个元素是一维数组的数组,那么→二维数组的每一行其实就是一个元素(且这个元素是一维数组)
2,数组名是数组首元素的地址,那么→二维数组的数组名也就是二维数组的第一行这个一维数组的地址
从上面我们可以推断:
二维数组传参的本质是:传递这个二维数组的第一行这个一维数组的地址
所以,二维数组传参的时候,也可以用数组指针的形式来书写

void test(int arr[3][5]) == void test(int (p)[5])
//这个变量p就是数组指针,存放的是这个二维数组里第一行一维数组的地址,类型是int(
)[5]

三,函数指针变量

函数指针变量就是用来存放函数的地址的指针变量
有了函数的地址以后,我们就可以通过地址来调用函数

1,函数的地址

函数有没有地址?函数的地址又该怎么拿到呢?
我们做个测试👇🏻
在这里插入图片描述
我们发现:1,函数也是有地址的,可以用 &函数名 来获得,2,函数名表示的是函数的地址

2,创建函数指针

函数指针的写法与数组指针类似,下面进行函数指针创建的展示👇🏻

void test()
{
    printf(“天天开心”);
}
void(*pf1)()= &test; //pf1存放的就是test函数的地址
int Add(int x, int y)
{
   return x+y;
}
int (*pf3)(int, int ) = &Add; //pf3存放的就是Add函数的地址
(或者) == int (*pf3)(int x, int y ) = &Add;

函数指针类型解析👇🏻:
在这里插入图片描述

3,函数指针的使用

通过函数指针调用指针指向的函数👇🏻

int main()
{
	int(*pf3)(int, int) = Add;
	printf("%d\n", (*pf3)(2, 3));
	printf("%d\n", pf3(2, 3));
	return 0;
}

输出结果:
5
8


🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!

  • 115
    点赞
  • 114
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 106
    评论
sscanf函数是C语言中一个非常常用的函数,它可以将一个字符串按照指定的格式转换成相应的数据类型。在嵌入式开发中,sscanf函数也是非常常见的,因为很多时候需要从串口或者其他外部设备中读取数据,并将其转换成相应的数据类型进行处理。下面是一些sscanf函数的使用技巧: 1. 使用sscanf函数时一定要注意格式字符串的正确性。格式字符串中的占位符必须与待转换的数据类型相对应,否则会发生未知错误。 2. 如果待转换的字符串中包含多个数据,可以使用多个占位符进行转换。例如,如果待转换的字符串为"1,2,3",可以使用" %d,%d,%d"的格式字符串进行转换。 3. 可以使用sscanf函数的返回值来判断转换是否成功。如果返回值等于待转换字符串的长度,则说明转换成功,否则转换失败。 4. 如果待转换的字符串中包含浮点数,可以使用"%f"或者"%lf"的格式字符串进行转换。 5. 如果待转换的字符串中包含十六进制数,可以使用"%x"的格式字符串进行转换。 6. 如果待转换的字符串中包含字符或字符串,可以使用"%c"或者"%s"的格式字符串进行转换。 7. 如果待转换的字符串中包含指针类型的数据,可以使用"%p"的格式字符串进行转换。 总之,在使用sscanf函数时一定要注意格式字符串的正确性,否则很容易出现转换错误的情况。同时,还应该注意sscanf函数返回值的判断,以确保转换的正确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 106
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

愚润求学

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

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

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

打赏作者

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

抵扣说明:

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

余额充值