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

发布于2022-01-13 07:23:25
6个回答
admin
网友回答2022-01-13
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); }
admin
网友回答2022-01-13
在定义字符串的时候有个区别 例如在函数内部定义char *str = "12345"和char str[] = "12345"; 其区别在于前者内存分配在常量区而后者在栈区,也就是说前者不可以更改str中的内容而后者可以。 另外可以把数组当作一个不可以改变内存地址的一个指针,即指针常量 恩,林锐博士写的书 你补充的问题就是我上面提到的 两者分配的内存空间不同 char p[]="hello";与char *p="hello"; 若在函数内部定义,前者分配在栈上,可改变每个字符内容;后者分配在常量区,不能改变内容 重看了你的提问 问题是出在return上。 需要知道的一点是函数中前者的字符串分配在栈内存中,当函数结束返回时系统会回收掉栈内存,这时候在调用函数中如果需要再用到被调用函数中的p的内存时将可能会出错,因为那块内存随着函数的返回被回收,内存的内容不确定。 而因为后者内存分配在常量区,生命周期为程序的生命周期 不清楚可以继续提问
admin
网友回答2022-01-13
数组可以在栈(stack)中开辟,也可以在堆中开辟,数组是连续的内存空间; 指针指向一块动态内存(堆,heap),指针本身也是存储在堆中的。 针对你的例子 char p[] 若是全局变量,在整个程序运行完毕后是系统自动销毁的; char *p指向的内存中存放的"hello"的空间是不会自动释放掉。当指针p丢失时候,这块内存就找不到了,也就是内存泄露
admin
网友回答2022-01-13
int arry[10];//这个是在内存中开连续的10个int存储空间 int *p;//这个只不过是定义指针,在内存中做的和int nub;是一样的事情,不过nub可以用来存储数字具体数据,p只能用来存储地址
admin
网友回答2022-01-13
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语言中,数组名本身就代表数据首元素的地址。
admin
网友回答2022-01-13
定义成 char p[] 多用了一部分内存,程序内存里会出现 2个 “hello”字符串。。

回到
顶部