| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
x
 
 本帖最后由 风扫地 于 2018-11-10 17:57 编辑  
 
测试代码: 
- 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 
 
 
 |   
 
 
 
 |