指针与数组 内存分配

char *a = "hello world";首先,操作系统在编译器规划内存方案中的的文字常量区分配一段内存,存储"hello world"字符串,然后在栈区分配一个内存,存储"hello world"字符串所在内存的首地址。  
char b[] = "hello world";操作系统在编译器规划的内存方案中的栈区分配一段连续内存空间(12个字节),存储"hello world"字符串。  
因此,当函数退出,数组b及其内容就不存在了。但是指针a的内容仍然存在,因为其是在常量区安家的嘛!  到此,你可能稍微理解了一点,但随之而来的更大疑惑可能就是:数组和指针同为地址,咋待遇差别就那么大呢?为什么数组首地址指向的内容就不能放在文字常量区呢?怎么样?我猜对了你的心思没有?继续向下看!  
首先,文字常量区,顾名思义,放的是常量,不能是其他。那么数组是常量吗?比如:char b[] = "hello world"?咋看上去好像是,事实上非也。要是换种写法,你可能就恍然大悟。  b[0]='h',b[1]='e',b[2]='l'........b[0],b[1],b[2]都是字符变量的标识,所以定义一个数组就相当于一次定义好多个变量,而且这些变量都挨个儿站,以方便集体处理。  
回头再看一眼它:char *a = "hello world"。显然,左边只有一个指针变量标识,而且它要求指向的地址里面的内容为一个常量字符串。而右边的常量字符串就很无辜了,我家都没呢!怎么把地址告诉你?所以编译器只好在文字常量区给常量字符串先安家,再把家的地址告诉指针变量a。  蓦然回首,人家数组多安逸啊,在哪里定义,值就放在哪里,所以数组的首地址存放的即为数组的首个元素值。而指针则要先摸地址,再请客。这正是数组和指针的本质区别。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值