社区
C语言
帖子详情
麻烦哪位帮我归纳一下数组和指针相比较而言各自的优缺点,谢谢!
song1014
2002-05-11 05:58:35
麻烦哪位帮我归纳一下数组和指针相比较而言各自的优缺点,谢谢
...全文
234
8
打赏
收藏
麻烦哪位帮我归纳一下数组和指针相比较而言各自的优缺点,谢谢!
麻烦哪位帮我归纳一下数组和指针相比较而言各自的优缺点,谢谢
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
8 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
wudi_1982
2002-05-12
打赏
举报
回复
各有个得优点,数组更简单和直接一些,而指针有点抽象,但功能更强大!
abcicq
2002-05-12
打赏
举报
回复
讲的好,我去板板凳。
leizhengdeng
2002-05-11
打赏
举报
回复
////////////////////////////////////////////////////////////////////////////////
//Author: Lei Zhengdeng
//E-mail: leizhengdeng@163.net
//HomePage: http://arden.3322.net
//Date: Mar 01, 2002
////////////////////////////////////////////////////////////////////////////////
一般认为在c中分为这几个存储区
1栈 - 由编译器自动分配释放
2堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收
3全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束释放
4另外还有一个专门放常量的地方。 - 程序结束释放
在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc等分配内存的函数分配得到的就是在堆上。在所有函数体外定义的是全局量,加了static修饰符后不管在哪里都存放在全局区(静态区),在所有函数体外定义的static变量表示在该文件中有效,不能extern到别的文件用,在函数体内定义的static表示只在该函数体内有效。另外,函数中的"adgfdf"这样的字符串存放在常量区。
比如:
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b; 栈
char s[] = "abc";栈
char *p2; 栈
char *p3 = "123456"; 123456\0在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一块。
}
还有就是函数调用时会在栈上有一系列的保留现场及传递参数的操作。
栈的空间大小有限定,vc的缺省是2M。栈不够用的情况一般是程序中分配了大量数组和递归函数层次太深。有一点必须知道,当一个函数调用完返回后它会释放该函数中所有的栈空间。栈是由编译器自动管理的,不用你操心。
堆是动态分配内存的,并且你可以分配使用很大的内存。但是用不好会产生内存泄漏。并且频繁地malloc和free会产生内存碎片(有点类似磁盘碎片),因为c分配动态内存时是寻找匹配的内存的。而用栈则不会产生碎片。
char s1[] = "aaaaaaaaaaaaaaa";
char *s2 = "bbbbbbbbbbbbbbbbb";
aaaaaaaaaaa是在运行时刻符值的,而bbbbbbbbbbb是在编译时就确定的
但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。
比如:
#include <stdio.h>
void main()
{
char a = 1;
char c[] = "1234567890";
char *p ="1234567890";
a = c[1];
a = p[1];
return;
}
10: a = c[1];
00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh]
0040106A 88 4D FC mov byte ptr [ebp-4],cl
11: a = p[1];
0040106D 8B 55 EC mov edx,dword ptr [ebp-14h]
00401070 8A 42 01 mov al,byte ptr [edx+1]
00401073 88 45 FC mov byte ptr [ebp-4],al
第一种在读取时直接就把字符串中的元素读到寄存器cl中,而第二种则要先把指针值读到edx中,在根据edx读取字符,显然慢了。
一般大家说的堆栈和栈是一样的,就是栈(stack),而说堆时才是堆heap.
栈是先入后出的,一般是由高地址向低地址生长。
相关的一个图:
http://arden.3322.net/arrpnt.txt
idler
2002-05-11
打赏
举报
回复
是否容易造成错误主要看编程者是否有清晰的思路和良好的书写习惯,一般来讲比较清晰的结构不容易导致错误。
erx
2002-05-11
打赏
举报
回复
用指针定位数组元素比下标定位效率要高
earthharp
2002-05-11
打赏
举报
回复
还有,指针有野的,数组只有家的,呵呵
Fuxiao
2002-05-11
打赏
举报
回复
归纳得还可以。
晨星
2002-05-11
打赏
举报
回复
数组,静态分配空间,而且局部申请,局部释放,你不用为他的内存空间管理而费心,缺点是灵活性不强,需要在编译时就确定数组的大小。
指针需要动态分配空间,极大的方便了动态数据结构的构造,因而灵活性强,但内存空间的管理只能靠手工完成,而且容易造成内存错误。
但一个称职的C/C++程序员应该能够熟练操作各类指针,扬其长,避其短。
Linux C编程进阶之
指针
与
数组
解析
数组
与
指针
是C语言的难点和重点,如果不懂
指针
和
数组
,就谈不上会C语言,更谈不上精通,本教程凝结了多年讲授C语言编程的心血,总结出了容易理解、简单使用的
指针
数组
分析技巧,通过该技巧分析出
数组
名、多维
数组
、...
数组
:如何实现基于索引的查找?
在实际操作中,我们还要注意根据
数组
的
优缺点
合理区分
数组
和链表的使用。
数组
定义简单,访问方便,但在
数组
中所有元素类型必须
相
同,
数组
的最大长度必须在定义时给出,
数组
使用的内存空间必须连续等。
相
对而言,
数组
更适合在数据数量确定,即较少甚至不需要使用新增数据、删除数据操作的场景下使用,这样就有效地规避了
数组
天然的劣势。在数据对位置敏感的场景下,比如需要高频根据索引位置查找数据时,
数组
就是个很好的选择了。
状态机与编程以及函数
指针
数组
的妙用
转自:http://kb.cnblogs.com/page/528971/ 状态机的概念 状态机是软件编程中的一个重要概念,比这个概念更重要的是对它的灵活应用。在一个思路清晰而且高效的程序中,必然有状态机的身影浮现。 比如说一个按键命令解析程序,就可以被看做状态机:本来在A状态下,触发一个按键后切换到了B状态,再触发另一个键后切换到C状态,或者返回到A状态。这
【合集】zz
数组
与
指针
的艺术--深入探索c/c++
数组
与
指针
http://bbs.sjtu.edu.cn/bbscon,board,C,file,M.1290521786.A.html http://topic.csdn.net/u/20091123/11/0c03d2e2-0655-4634-8287-0e2315d889fc.html 一直以来想把2005年写的《再再论
指针
》修改
一下
,因为经过了这么多年,对C/C ++的理解与05年
相
比又有了...
【数据结构】
数组
:如何实现基于索引的查找
由于
数组
中没有栈和队列那样对于线性表的限制,所以增删查操作变得灵活很多,代码实现的方法也更多样,所以我们要根据实际需求选择适合的方法进行操作。在实际操作中,我们还要注意根据
数组
的
优缺点
合理区分
数组
和链表的使用。
数组
定义简单,访问方便,但在
数组
中所有元素类型必须
相
同,
数组
的最大长度必须在定义时给出,
数组
使用的内存空间必须连续等。
相
对而言,
数组
更适合在数据数量确定,即较少甚至不需要使用新增数据、删除数据操作的场景下使用,这样就有效地规避了
数组
天然的劣势。...
C语言
69,382
社区成员
243,073
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章