永发信息网

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

答案:6  悬赏:80  手机版
解决时间 2021-02-10 01:38
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);
}
全部回答
定义成 char p[] 多用了一部分内存,程序内存里会出现 2个 “hello”字符串。。
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语言中,数组名本身就代表数据首元素的地址。
int arry[10];//这个是在内存中开连续的10个int存储空间 int *p;//这个只不过是定义指针,在内存中做的和int nub;是一样的事情,不过nub可以用来存储数字具体数据,p只能用来存储地址
数组可以在栈(stack)中开辟,也可以在堆中开辟,数组是连续的内存空间; 指针指向一块动态内存(堆,heap),指针本身也是存储在堆中的。 针对你的例子 char p[] 若是全局变量,在整个程序运行完毕后是系统自动销毁的; char *p指向的内存中存放的"hello"的空间是不会自动释放掉。当指针p丢失时候,这块内存就找不到了,也就是内存泄露
在定义字符串的时候有个区别 例如在函数内部定义char *str = "12345"和char str[] = "12345"; 其区别在于前者内存分配在常量区而后者在栈区,也就是说前者不可以更改str中的内容而后者可以。 另外可以把数组当作一个不可以改变内存地址的一个指针,即指针常量 恩,林锐博士写的书 你补充的问题就是我上面提到的 两者分配的内存空间不同 char p[]="hello";与char *p="hello"; 若在函数内部定义,前者分配在栈上,可改变每个字符内容;后者分配在常量区,不能改变内容 重看了你的提问 问题是出在return上。 需要知道的一点是函数中前者的字符串分配在栈内存中,当函数结束返回时系统会回收掉栈内存,这时候在调用函数中如果需要再用到被调用函数中的p的内存时将可能会出错,因为那块内存随着函数的返回被回收,内存的内容不确定。 而因为后者内存分配在常量区,生命周期为程序的生命周期 不清楚可以继续提问
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
雅希少儿舞蹈培训基地地址在哪,我要去那里办
怀远县卫生职业培训中心地址在什么地方,想过
安第斯酒店-西餐厅在什么地方啊,我要过去处
今天我们学校艺术节,我穿裙子,穿了打的底裤
Excel求银行计算利息小数点后取舍公式
韩国维娜美容美体SPA护肤中心在哪里啊,我有
大连软件园全信合信息技术有限公司怎么样?
五河县高考辅导学校地址好找么,我有些事要过
怎么看苹果手机微信是不是最新的
常见的绿化花草名称〈南方〉
晶晶亮土产日杂在什么地方啊,我要过去处理事
民生工程就业技能(龙亢培训点)怎么去啊,我要
为进一步明确诊断,还需要进行的检查是A.纤维
梦见黑狗咬我
上巴里地址在哪,我要去那里办事
推荐资讯
一个底面是正方形的长方体,侧面展开恰好是一
瑞霭庭惟是什么意思
鸡西市梨树区国家税务局这个地址在什么地方,
QQ游戏大厅怎么隐藏自己的QQ号
华联桌球城地址在哪,我要去那里办事
我国卫生发展战略在卫生事业重点选择上,要把
北京市海淀区硅谷旁边的工商银行叫什么行
CF终结者模式里看见一个生化猫本来不是母体,
包头附近有草原吗?
烧鸡公在哪里啊,我有事要去这个地方
dell inspiron 15 7000 系列 7566 用的什么屏
保洁干洗水洗在哪里啊,我有事要去这个地方
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?