char a[] = "hello world1"和char *p = "hello world2";的区别

  1.  1 #include<stdio.h>  
  2.   
  3.  2   
  4.   
  5.  3 int main()  
  6.   
  7.  4 {  
  8.   
  9.  5         char a[] = "hello world1";  
  10.   
  11.  6         char *p = "hello world2";  
  12.   
  13.  7         *(a+1)='q';  
  14.   
  15.  8         *(p+1)='q';  
  16.   
  17.  9         printf("%s\n",a);  
  18.   
  19. 10         printf("%s\n",p);  
  20.   
  21. 11   
  22.   
  23. 12 }  

运行结果

段错误。

注释 *(p+1)='q';

运行结果

hqllo world1

hello world2

原因:

 

一、a与p类型不同:p为指向字符串的指针;a为保存字符串的数组。

 char a[] = "hello world1";   是个赋初值的字符数组。
 char *p = "hello world2";  是个字符串常量指针;

指针变量p在栈里面

字符串常量"hello world2"在全局数据区,数据段,只读,不可写

cout<<*a<<" "<<*p<<endl;

cout<<a<<" "<<p<<endl;

结果是:

h h

hello world1 hello world2
二、"hello world2""hello world1"字符串保存的位置不同。"hello world1"保存在栈
    中,可用*(a+1)='q'修改,"hello world2"保存在全局数据
    区,位置是在.rodata中,不能修改*(p+1)='q'


三、只有2中情况下,数组名不可等同视为数组指针,&sizeof操作符
    “&的区别:
    &p取得是指针变量的地址,而非字符串"hello world2"的首地址,p指向字符串的首地址;&a取得
    就是字符串"hello"的首地址。
    “siziof的区别:
    下面假设在32位平台上运行,保存变量的内存空间不同。
    sizeof(p); // return 4, pointer size
    sizeof(a); // return 13, array size

 

  1. 5               char a[] = "hello world1";  
  2. (gdb) p a         
  3. $1 = "\000<\006޿�\005޿�?�"//空  
  4. (gdb) s  
  5. 6               char *p = "hello world2";  
  6. (gdb) p a         
  7. $2 = "hello world1"  
  8. (gdb) p &a  
  9. $3 = (char (*)[13]) 0xbfde0583  //在栈  
  10. (gdb) s  
  11. 7               *(a+1)='q';  
  12. (gdb) p p  
  13. $4 = 0x80484c0 "hello world2"  //在数据段  
  14. (gdb) p &p  
  15. $5 = (char **) 0xbfde0590   //在栈  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值