1130|6

237

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

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

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

 

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

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

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

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

此帖出自单片机论坛

最新回复

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

回复
举报

8

帖子

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);

此帖出自单片机论坛
 
 
 

回复

7187

帖子

2

TA的资源

版主

4
 

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

此帖出自单片机论坛
 
 
 

回复

6105

帖子

4

TA的资源

版主

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

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

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

此帖出自单片机论坛
 
 
 

回复

6471

帖子

9

TA的资源

版主

6
 

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

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

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

 
 

回复

1078

帖子

0

TA的资源

纯净的硅(高级)

7
 

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

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

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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