堆栈中数组与指针的区别

来源:百度知道 编辑:UC知道 时间:2024/05/21 08:31:41
http://baike.baidu.com/view/93201.htm
看了上面网址的一位前辈写的关于堆栈的高论,堆其中一点不明白:
main()
{
char *p="123456"; 123456\0在常量区,p3在栈上。
char s[] = "abc"; 栈
}
就是数组那一句有点模糊,到底只是数组名s在栈中呢?还是连同"abc"也是在栈中?亦或者"abc"跟上面指针的"123456"一样,也是在常量区??
希望得以高手帮帮解惑,谢谢!

(1)分配内存
假设有字符型指针变量与字符数组如下:
char *p ,s[10];
编译器为字符数组s分配10个字节内存,用于存放10个字符。而编译器只为指针变量p分配4个字节内存。
(2)初始化赋值含义
   字符数组与字符指针的初始化赋值形式相同,但其含义不同。例如:
char s[ ] ="I am a student ! " ;
char *p="You are a student too ! " ;
对于字符数组是将字符串放到为数组分配的存储空间去,而对于字符指针是先将字符串存放到内存,然后将 存放字符串的内存起始地址送到指针p中。  
(3)赋值方式
字符数组只能对其元素逐个赋值,而不能将字符串赋给字符数组名。对于字符指针变量, 字符串地址可直接赋给字符指针变量。例如:
s="I love China! "; //字符数组名s不能直接赋值,该语句是错误的。
p="I love China! "; //指针变量p可以直接赋字符串地址,语句正确

char *p="123456";
char s[] = "abc";

内容 "123456" ,"abc" 本身是在常量区
运行到函数时 指针变量 p 和 数组变量 s 是分配在栈上

p 指向常量区的内容 "123456"
s 中的内容 "abc" 是从常量区复制过来的

函数结束以后,变量 p, s 就都不存在了
p 指向的地址仍是有效的,s 所在地址的内容就不确定了
这个看一下生成的汇编代码就清楚了

#include "stdio.h"
#include &quo