来谈谈你对C语言中字符串的理解
本帖最后由 风扫地 于 2018-11-10 17:57 编辑测试代码:
printf(&("0123456\n"));
printf("0123456\n"+3);
1.
这两句话能编译通过吗?字符串能和整数相加吗?
如果不能是为什么?
如果能,那会输出什么?
2.
在某个函数内定义
char*p1 = "0123456\n";
char p2 = "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
1.我是不知道喽,就复制代码试了一下,两个代码都输出了3456\n,看来C把字符串视为首地址,字符串与数字相加也就是一个指针移位的操作。
2.p1为一个字符指针,指向一个字符串,p2为一个字符数组。 强烈支持楼主ing…… 支持楼主! 1 竟然能够输出
表示有点懵
猜想 想不出 为什么跟+3相同 求解
首地址移3
2
不同
p1 字符串指针
p2字符串数组名
同
都为地址相同
以上仅个人见解
求大佬帮忙指点 震惊 楼主真有好想法。我用了这么久竟然没有想过这种东西。学习了。。。。。 谈谈我的一点想法:
1. C把字符串按照指针的方式处理。这样,+3 就是指针地址+3 ; 【3】 就是说这个是个数组。所以输出都一样。
2. 这个好理解,一个是字符串,一个是字符数组 whdd 发表于 2018-10-19 16:01
1 竟然能够输出
表示有点懵
猜想 想不出 为什么跟+3相同 求解
第一个问题,前面还取了地址&,才与 + 3相同;
第二个问题,对的,都是地址,如果一定要说有什么不同,p1是指针变量(其值能被改变),p2是指针常量(其值不能被改变)。 @无敌太刀
@llllzll
@常德水鱼村
@whdd
@余生愿你常欢笑
@wwhywhy
为啥我不能at别人,我貌似记得我被别人at过。
页:
[1]