1042|6

237

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

求教下数组字符串和字符串指针有什么区别 [复制链接]

本帖最后由 z45217 于 2023-2-13 08:32 编辑

 

今天写程序碰到个问题,mqtt_number用数组或者指针都可以正常连接到MQTT,收发都正常

但是会使设备在一定情况下自动重启,我看了下结构体里这两个参数也是指针的

请教下各位大佬,这两种有什么区别呢

 谢谢各位了,问题已经解决,就是各位大佬回复的那样,指针定义的是字符串常亮,不能被修改,我程序底下有去修改这个值

此帖出自单片机论坛

最新回复

结果可能是相同的,但自身的“类型”不同。   详情 回复 发表于 2023-2-12 14:59
点赞 关注
 

回复
举报

7

帖子

0

TA的资源

一粒金砂(中级)

沙发
 

const char *p的形式可以修改p的值合法,也就是让p指向别的字符串合法,但是通过p修改指向的内容是非法的;使用char p[]的形式,修改p指向的值合法,但是修改p的值非法。

1.首先你要清楚“字符串字面值”是什么?“字符串字面值”就是形如你文中的"RF1_230220901"这样的一个不可寻址的一个字符串,它是右值,不可寻址意味着你不能使用取地址符&来取它的地址,对应的汇编语言是个立即数,但是这个字符串字面值在虚拟内存中仍然占有一个位于常量区的地址空间,地址即字符'R'的存储地址。尤其要注意,这样的字面值常量,在最后一个字符,这里是'1'的后面,一定有个隐匿的‘\0’字符来表示字符串字面值的结束。

2.使用const char * p = "RF1_230220901"这样形式来表示一个字符串,就是让指针p指向这个字面值常量,也就是'R'的地址,因为"RF1_230220901"放在常量区,你不能通过p去修改字符串的内容,但是你通过p去访问每个字符仍然是允许的,就是说,可以*(p+1)去访问'F'这个字符,但是你试图去修改p+1这个地址里面的内容,就是*(p +1) = 'L‘这样是是非法的,因为常量区的数据不能修改。你还可以用这个指针指向别的字符串,比如你现在const char * p = "1234"也是合法的。

3.使用 char p[] = "RF1_230220901"这样的形式,是把"RF1_230220901"这个内容,不包含结尾的'\0'字符拷贝给这个字符数组,因为这个数组没有结束字符'\0',所以使用strlen(p)这样的函数,行为未定义,程序会崩溃,但是因为这是个字符数组,你可以修改字符数组中的内容,比如*(p + 1) = 'Q'这样是合法的,但是你试图修改p的值,也就量数组名的值是非法的。

此帖出自单片机论坛

点评

懂了,谢谢大佬,我确实有用下面指令去修改P的值 memcpy(&mqtt_number[4], serial_number,  8);  详情 回复 发表于 2023-2-10 15:49
 
 

回复

237

帖子

0

TA的资源

一粒金砂(高级)

板凳
 
liurui31 发表于 2023-2-10 15:27 const char *p的形式可以修改p的值合法,也就是让p指向别的字符串合法,但是通过p修改指向的内容是非法的; ...

懂了,谢谢大佬,我确实有用下面指令去修改P的值

memcpy(&mqtt_number[4], serial_number,  8);

此帖出自单片机论坛
 
 
 

回复

6773

帖子

2

TA的资源

版主

4
 

指针和数组其实有时候是一样的,像你这种情况就是不一样的,指针只是指向了一个字符串,而数组是开辟了一段空间存储字符串内容,且内容是可修改的。

此帖出自单片机论坛
 
 
 

回复

6069

帖子

4

TA的资源

版主

5
 
本帖最后由 damiaa 于 2023-2-10 17:23 编辑

数组的最后面那个字节要加'\0' (中间加也可以,只是用字符串指针访问时后面的部分就丢弃了)然后指针访问的时候 其实就是字符串了。这样就不会出错。

字符串在定义时候就自动加了。

此帖出自单片机论坛
 
 
 

回复

6060

帖子

6

TA的资源

版主

6
 

指针存储的是地址,数组存储的数据             

此帖出自单片机论坛
 
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 

回复

1025

帖子

0

TA的资源

纯净的硅(高级)

7
 

结果可能是相同的,但自身的“类型”不同。

此帖出自单片机论坛
 
个人签名چوآن شـين
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
Luminary系列所有型号的选型工具

Luminary的函数库和图形库,上面集成的东西很丰富,很多工程师都会喜欢。 可以按着对外设的需求,来选。想要USB,就点“USB ...

单片机操作2.4寸TFT彩屏的源码与大家共享!含SD驱动!

元旦在淘宝上,花39个银子,淘了块2.4寸的TFT彩屏模块,,用店主提供的代码,用STC的51单片机,驱动起来,也显示图片了,发帖庆祝 ...

[Open Source]YS18-3荧光管电子时钟100%开源放送(软件源工程及代码.硬件原理图)

YS18-3的荧光管电子时钟曾是饱含了我所有期待的完美的荧光管电子时钟,它的功能比较完备,也受到了很多DIYer的关注与支持。 ...

Helper2416开发板移植ucgui(嵌入式linux运行ucgui)

本帖最后由 Gyroxp 于 2015-1-30 17:28 编辑 一些简单的应用,使用ucgui作为图形界面可能更加方便快捷。得益于ucgui良好 ...

求推荐:想买本C8051F单片机的书!

需要用C8051F580单片机开发产品。我做软件,C语言。 想买本 这方面的书。求推荐! 谢谢!

MSP430F149 I/O口控制

所谓IO口控制就是控制单片机的端口输出0或1,或者读出端口的状态,也就是输入和输出。 先说输出。想让MSP430单片机的端口 ...

无线连接技术选择指南

选择合适的无线连接技术从一开始就是一个关键的设计决策。这决定了应用的协议互操作性、距离、稳健性和用例。本选择指南将引导 ...

【花雕动手做】有趣好玩的音乐可视化系列小项目(16)--热干胶棒棒灯

偶然心血来潮,想要做一个声音可视化的系列专题。这个专题的难度有点高,涉及面也比较广泛,相关的FFT和FHT等算法也相当复杂,不 ...

颁奖:是德科技感恩月—遇见KeysightCare - 贵重仪器安全避坑指南

颁奖:是德科技感恩月—遇见KeysightCare - 贵重仪器安全避坑指南 名单详见下方列表。本颁奖贴只公布获奖名单,礼品 ...

【STM32U5A5ZJ开发板】USB设备及VCP通讯测试

STM32U5A5ZJ 上的USB是自带PHY的OTG USB设备,不但具有电源管理还具有设备管理功能,使用的接口也是Type C接口。 794377 ...

关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表