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语言中,数组名本身就代表数据首元素的地址。

C语言中,数组和指针定义在内存方面的区别在哪?
1,指针变量用于保存数据的地址,数组用于直接保存数据(当然你可能见过,数组的每个元素是指针,不过,一组指针也是数据,它们各自的内容才是地址)2,访问方式:指针是间接访问,首先取得指针的内容作为地址,再去该地址访问数据;数组是直接访问,数组名即是地址 3,指针通常用于动态数据;数组通常用于固定...

c语言数组和指针的区别
C语言中,数组和指针是两个不同的概念,它们之间存在显著的区别:定义与本质:数组是一种数据结构,用于存储固定数量的同类型元素的连续内存块。而指针是一个变量,其值是一个内存地址,用于指向内存中的某个位置。内存分配:数组在编译时分配内存空间,其大小在声明时确定且固定不变。指针本身只占用固定...

C语言中,指针和数组的区别和联系?
区别:C语言把内存划分成四个区,它把一般的变量和数组等存在于内存中的栈区,所以数组在C语言的定义中只是一组同类型的普通变量,即使这个变量有可能是指针。所以他的作用比指针小的很多,而指针可以指向任何区的任何数据,所以就会觉得指针和数组名很像,但是必须要注意的是,数组名只是指针中的一种,...

指针和数组的区别
指针和数组的区别是指针变量用于保存数据的地址,数组用于直接保存数据。指针一般指向一个函数或一个变量,在信息工程中是一个用来指示一个内存地址的计算机语言的变量或中央处理器(CPU)中的寄存器(Register)。指针一般出现在比较近机器语言的语言,如汇编语言或C语言。面向对象语言如Java一般避免用指针,而是...

c语言指针数组和数组指针的区别
对指针数组来说,首先它是一个数组,数组的元素都是指针,也就是说该数组存储的是指针,数组占多少个字节由数组本身决定;而对数组指针来说,首先它是一个指针,它指向一个数组,也就是说它是指向数组的指针,在 32 位系统下永远占 4 字节,至于它指向的数组占多少字节,这个不能够确定,要看具体...

C语言:简述一下“数组和指针的关系”?
一、概念 数组:数组是用于储存多个相同类型数据的集合。指针:指针相当于一个变量,但是它和不同变量不一样,它存放的是其它变量在内存中的地址。二、赋值、存储方式、求sizeof、初始化等 1.赋值 同类型指针变量可以相互赋值,数组不行,只能一个一个元素的赋值或拷贝 2.存储方式 数组:数组在内存中...

字符串数组与字符指针的区别
C语言有两种表示字符串的方法,一种是字符数组,另一种是字符串常量,它们在内存中的存储位置不同,使得字符数组可以读取和修改,而字符串常量只能读取不能修改。三、存取效率 char *a = “abcd”; 存于静态存储区。在栈上的数组比指针所指向字符串快,因此慢。而char a[20] = “abcd”; 存于...

C语言里,什么时候用数组什么时候用指针和动态内存(malloc\/calloc)?
数组大小确实有限制.因为局部数组是分配在栈上的,而栈大小是有限制的,如果超过限制,就会出现栈溢出.如果不能明确知道所需内存的大小,编程中这种情况非常常见.这个时候只能用动态内存.但是用动态内存容易出bug,主要是忘记忘记释放内存(内存溢出)和野指针(指针指向的地址不是malloc分配的内存地址). 另外,...

C中数组和指针到底是否相同?
下面着重谈一下指针和数组的区别。一.指针和数组的定义 指针是指针,指针变量存储的是一个地址,用来间接访问数据,在32位系统下,一个指针变量(包括void指针)始终占4个字节的空间。指针可以指向任何内存空间,但不是任何内存空间都可以通过指针去访问。 数组是数组,定义一个数组之后,编译器便根据该数组元素的类型和个...

C语言中一维数组和指针有什么区别?
C语言中,一维数组的数组名指向了这个数组的起始地址,而指针是它指向的某个东西的地址。例如定义int a[5],访问第二个元素可以用a[1],也可以用*(a+1)。当一个指针指向某个数组时,数组名和指针的作用应该是一样的。你定义的这个指针没有指向任何东西,是个野指针,不能通过类似于数组的方式...

相似回答