鱼C论坛

 找回密码
 立即注册
查看: 1766|回复: 9

[技术交流] 来谈谈你对C语言中字符串的理解

[复制链接]
发表于 2018-10-18 17:02:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 风扫地 于 2018-11-10 17:57 编辑

测试代码:
printf(&("0123456\n"[3]));
printf("0123456\n"+3);
1.
   这两句话能编译通过吗?字符串能和整数相加吗?
   如果不能是为什么?
   如果能,那会输出什么?
2.
在某个函数内定义
char*  p1        = "0123456\n";
char   p2[10]   = "0123456\n" ;
p1和p2 有何异同?

震惊!!!!字符串竟然和整数发生那种事~



-------------------------------
来谈谈我的理解
1.两句话都能编译通过,且都输出"3456\n"
字符串在C语言中可以看成指向该字符串首字符的指针,所以字符指针加3得到的新指针指向'3',这一点也可以从printf的函数原型中得到验证,他的第一个参数就是指针类型的,而我们经常就传入一个字符串来使用printf;
2.p1和p2都是指针(地址),都可以使用指针的一些方法,如果一定要说有什么不同,p1是指针变量,他的指向可以改变,p2是数组名,可以当成指针常量,在p2的可见区域内,其指向是固定的,就是一个“常量"地址值,没有另外的空间来存储他的地址~
3.我们甚至可以将一个常数(比如说0x1000000)强制转换为一个指针,然后对这个指针指向的空间进行赋值,其实也就是对0x1000000这个空间赋值

*(char*)(0x1000000) = 0x65;//当然这个代码不是在所有的平台都能使用,可能涉及内存保护和内存访问权限的问题,这种方法常常在嵌入式平台上使用。



感谢大家的参与.


@无敌太刀
@llllzll
@常德水鱼村
@whdd
@余生愿你常欢笑
@wwhywhy


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-10-18 18:09:17 | 显示全部楼层

回帖奖励 +10 鱼币

1.我是不知道喽,就复制代码试了一下,两个代码都输出了3456\n,看来C把字符串视为首地址,字符串与数字相加也就是一个指针移位的操作。
2.p1为一个字符指针,指向一个字符串,p2为一个字符数组。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-18 21:55:46 | 显示全部楼层

回帖奖励 +10 鱼币

强烈支持楼主ing……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-19 14:41:39 | 显示全部楼层

回帖奖励 +10 鱼币

支持楼主!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-19 16:01:45 | 显示全部楼层

回帖奖励 +10 鱼币

1 竟然能够输出  
表示有点懵  
猜想   想不出   为什么[3]跟+3相同   求解
首地址  移3
2
不同  
p1 字符串指针
p2  字符串数组名

都为地址  相同
以上仅个人见解  
求大佬帮忙指点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-19 16:23:23 | 显示全部楼层

回帖奖励 +10 鱼币

震惊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-10-20 09:10:28 | 显示全部楼层
楼主真有好想法。我用了这么久竟然没有想过这种东西。学习了。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-20 09:12:27 | 显示全部楼层
谈谈我的一点想法:
1. C把字符串按照指针的方式处理。这样,+3 就是指针地址+3 ; 【3】 就是说这个是个数组。所以输出都一样。
2. 这个好理解,一个是字符串,一个是字符数组
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-22 17:54:13 | 显示全部楼层
whdd 发表于 2018-10-19 16:01
1 竟然能够输出  
表示有点懵  
猜想   想不出   为什么[3]跟+3相同   求解

第一个问题,[3]前面还取了地址&,才与 + 3相同;
第二个问题,对的,都是地址,如果一定要说有什么不同,p1是指针变量(其值能被改变),p2是指针常量(其值不能被改变)。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-22 18:04:27 | 显示全部楼层
@无敌太刀
@llllzll
@常德水鱼村
@whdd
@余生愿你常欢笑
@wwhywhy


为啥我不能at别人,我貌似记得我被别人at过。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-30 14:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表