char 字符串常量的神秘

1.字符串常量不像 字符 一样可以是空 以为NUL  即 "\0"  在内存中 占位子

2.指针常常和字符串常量一起  程序中使用字符串常量会产生一个   "指向字符的指针"   表达式所使用的值就是这些字符所存储的地址,而不是字符本身

        所以    可以            char *p="字符串常量" (*p 指向字符所存储的地址) 

                  不可以           数组=字符串常量     以为字符串常量的  直接值   是一个指针  而不是  字符本身

                   但                   array[]="124566" ;   以这种形式初始化数组  实际上是  一个初始化列表  即   array[]={'1','2','3','4','5'};

                     初始化字符数组时它相当于一个 初始化列表  其他时候 都是 字符串常量      

详情 看代码

 1.       #include
   
   
    
    
          int main()
        {    char *ss="012345";
             printf ("%s\n",*ss);
              return 0;
        }
        1.c:4:6: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat=]
              printf ("%s\n",*ss);
          gcc编译器报错  说明 ss 所指的内容不 可以用 %s的格式打印 
          #include
    
    
     
     
          int main()
        {    char *ss="012345";
             printf ("%d\n",*ss);
              return 0;
        }
        root@ct-VirtualBox:~/code# gcc -o c  1.c
        root@ct-VirtualBox:~/code# ./c
        48
            48 是 '0' 的十进制ASCII码  *ss指的是字符串的第一个字符
            使用cout的不存在这个问题:
                                    #include 
     
     
      
      
                                            using namespace std;
                                            #include
      
      
       
       
                                              int main()
                                            {    char *ss="cghb";
                                               	cout<<*ss<
       
       
         int main() { char *ss="012345"; printf ("%s\n",ss); return 0; } root@ct-VirtualBox:~/code# gcc -o c 1.c root@ct-VirtualBox:~/code# ./c 012345 说明ss 指针本身值字符串 #include 
        
          int main() { char *ss="012345"; printf ("%d\n",*(++ss)); return 0; } root@ct-VirtualBox:~/code# gcc -o c 1.c root@ct-VirtualBox:~/code# ./c 49 #include 
         
           int main() { char *ss="asdfg"; printf ("%d\n",++(*ss)); //`````````` printf("%c\n",*(++s));可以得出s *ss是一个字符串常量 是不可以修改一个常量的值 return 0; } root@ct-VirtualBox:~/code# ./c Segmentation fault (core dumped) 要区别:#include 
          
            int main() { char s[]="asdfg"; //````````````注意这里是 数组 数组是一段连续的存储空间 它当前位置的值是可以改变的; printf("%c\n",++*s);//这是可以打印出 'b' 的 return 0; } ++ --俩个操作符 都需要一个 变量 作为 操作符 而不是常量 即需要 左值 *ss 是48 是int 常量 
           
          
         
       
      
      
     
     
    
    
   
   
    

3.要修改字符串   最好把它      存储在数组中

/***********************************************关于代码中的问题好像找到答案了***********************************************************/          

   来自:http://blog.csdn.net/yahohi/article/details/7427724

                 

这里的char ch[]="abc";
表示ch 是一个足以存放字符串初值和空字符'/0'的一维数组,可以更改数组中的字符,但是char本身是不可改变的常量。
char *pch = "abc";
那么pch 是一个指针,其初值指向一个字符串常量,之后它可以指向其他位置,但如果试图修改字符串的内容,结果将不确定。
     ______           ______      ______
ch: |abc\0 |    pch: | ◎----->  |abc\0 |
     ______           ______      ______

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值