字符指针与字符数组内存分配的区别

来源:互联网 发布:linux 软件版本 编辑:程序博客网 时间:2024/05/22 18:15
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。  蓦然回首,人家数组多安逸啊,在哪里定义,值就放在哪里,所以数组的首地址存放的即为数组的首个元素值。而指针则要先摸地址,再请客。这正是数组和指针的本质区别。
转自http://lyh830612.blog.163.com/blog/static/19027339720117172275544/