C语言中,数组和指针定义在内存方面的区别在哪?

char p[]="hello";与char *p="hello";定义在同一个函数中,结果return (p);
按照一般情况,两者没有太大区别,但看了下《高质量C编程》,
里面刚好也有这个例子,但从内存上考虑,有一种是错误的,
相信各位前辈遇到过同样的问题,有没有一个让人便于的理解?

1,指针变量用于保存数据的地址,数组用于直接保存数据(当然你可能见过,数组的每个元素是指针,不过,一组指针也是数据,它们各自的内容才是地址)
2,访问方式:指针是间接访问,首先取得指针的内容作为地址,再去该地址访问数据;数组是直接访问,数组名即是地址
3,指针通常用于动态数据;数组通常用于固定数目和类型的一组数据
4,定义指针变量并不会带来内存分配,要自行分配内存并且将指针变量的内容改写为分配好的地址,通常用内存分配函数如malloc达到;定义数组会隐式分配内存
5,对sizeof操作符的返回值影响,sizeof(指针)永远会返回平台指针大小,通常32位机返回4,64位返回8.而sizeof(数组名),则会返回数组的内存大小,这取决于数组包含多少个数据。
当然,在某些情况下,是可以混用的,比如作为函数的形参,无论你写成char s[]还是char *s,都没有区别,在函数内对这两种传来的实参作sizeof,也都只能是得到指针大小,并不会因为你写char s[],而返回数组的大小。
例如:
void fun(char s[])//和void fun(char *s)等同
{
printf("%d\n", sizeof(s));//输出4或者8,看平台和操作系统是32还是64
}
调用:
main()
{
char s[6] = {'h', 'e', 'l', 'l', 'o', '\0'};
fun(s);
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-04-16
在定义字符串的时候有个区别
例如在函数内部定义char *str = "12345"和char str[] = "12345";
其区别在于前者内存分配在常量区而后者在栈区,也就是说前者不可以更改str中的内容而后者可以。
另外可以把数组当作一个不可以改变内存地址的一个指针,即指针常量

恩,林锐博士写的书
你补充的问题就是我上面提到的
两者分配的内存空间不同
char p[]="hello";与char *p="hello";
若在函数内部定义,前者分配在栈上,可改变每个字符内容;后者分配在常量区,不能改变内容

重看了你的提问
问题是出在return上。
需要知道的一点是函数中前者的字符串分配在栈内存中,当函数结束返回时系统会回收掉栈内存,这时候在调用函数中如果需要再用到被调用函数中的p的内存时将可能会出错,因为那块内存随着函数的返回被回收,内存的内容不确定。
而因为后者内存分配在常量区,生命周期为程序的生命周期

不清楚可以继续提问追问

数组不就可以用一个指针来表示吗?为何两者在内存分配上又会有这样的区别呢?可否介绍本书,或资料关于内存处理的全过程,想彻底了解下!谢谢了!

追答

这些属于进阶内容了
推荐一本《C专家编程》

无论数组还是指针还是变量都是在内存中的一堆二进制码,但是由于编程的需要定制了不同的规则将其分配在不同的区域

本回答被网友采纳
第2个回答  2012-04-16
定义成 char p[] 多用了一部分内存,程序内存里会出现 2个 “hello”字符串。。
第3个回答  2012-04-16
int arry[10];//这个是在内存中开连续的10个int存储空间
int *p;//这个只不过是定义指针,在内存中做的和int nub;是一样的事情,不过nub可以用来存储数字具体数据,p只能用来存储地址
第4个回答  2012-04-16
0、没有错啊(vs2010可编译通过);
1、char p[]的话是声明一个字符数组,幷用“hello”初始化。h e l l o \0这六个字符是放在p这个位置的,而且p的值已经在编译时有系统确定,你不能这样修改:
char src[] = "adsf";
p = src; //错误
*p是可以修改的。
2、char *p= “hello” 是将指针p指向字符串常量“hello”所在的地址。注意:常量“hello”的地址会根据系统不同放入不同的地址,但是它是不可更改的,(常量),也就是*p不能修改。
3、不过在c语言中,数组名本身就代表数据首元素的地址。
相似回答