论坛: 编程破解 标题: 看看你的c水平 复制本贴地址    
作者: zhoen889 [zhoen889]    论坛用户   登录
1.堆,栈和队列有什么不同?
2.局部变量和全局变量应该放在上面三个哪个当中?
3.const char *p;
  char const *p;
  char *const p;
她们有什么区别?


地主 发表时间: 06-02-26 17:45

回复: flynet [flynet]   论坛用户   登录
1.堆,栈和队列有什么不同?

堆是在内存中动态分配的。不要用户来控制其结构,只需要简单的new出来最后delete掉。
而栈的第一中理解是一种数据结构,和队列是相对的。栈是先进后出,队列是先进先出。
栈的第二中理解是:栈和堆是平级的都是操作系统放内存的地方,不同的是栈是在变量定义的时候,在编译时就生成并且确定的。而堆是new出来的,动态的。

2.局部变量和全局变量应该放在上面三个哪个当中?
看了1问,这个就好理解了。
局部变量放在栈中。全局变量,也应该在栈中。
而堆是如何呢?先定义一个指针,指针放在栈中,然后new出内存,并把这个指针指向这个内存,那么这个内存在堆中。而指针呢,还是在栈中
    说到底,定义的东西,在栈中,执行完了,自动释放内存,你不用管,也管不了。而new动态分配的内存,在堆中,你得记得释放它,否则就是内存泄露。

队列呢?与这2个不搭边,只是一种数据结构,和单纯的先进后出的那种栈对应。

请分清除两种栈,一种指操作系统中变量保存的地方,另一种指一种数据结构。不要搞混了。


3.const char *p;
  char const *p;
  char *const p;
她们有什么区别?
恕我短浅,确实不太弄的清楚,请高手告知,非常感谢。

B1层 发表时间: 06-02-26 23:18

回复: ziaichen [ziaichen]   论坛用户   登录
1:栈和堆栈都指的是Stack,它们与堆(heap)是不同的概念,从堆和栈的功能和作用来通俗的比较,堆主要用来存放对象的,栈主要是用来执行程序的。
  栈(stack)是限定仅在一端进行插入或删除的线性表。虽然这个限制减小了栈的灵活性,但是它也使得栈更有效且更容易实现。许多应用都只是需要提供受限制的插入和删除操作,在这种情况下使用较简单的栈结构比使用一般的线性表更有效。
  堆是应用程序在运行的时候请求操作系统分配给自己内存,由于从操作系统管理的内存分配,所以在分配和销毁时都要占用时间,因此用堆的效率非常低.但是堆的优点在于,编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间,因此,用堆保存数据时会得到更大的灵活性。事实上,面向对象的多态性,堆内存分配是必不可少的,因为多态变量所需的存储空间只有在运行时创建了对象之后才能确定.在C++中,要求创建一个对象时,只需用new命令编制相关的代码即可。执行这些代码时,会在堆里自动进行数据的保存.当然,为达到这种灵活性,必然会付出一定的代价:在堆里分配存储空间时会花掉更长的时间!
  堆栈是一个在计算机科学中经常使用的抽象数据类型,当然包括数据结构和操作系统上不同的两种表述。
  至于队列就是一种数据结构,就不再仔细说明。

2:栈”里存储的是一些局部变量、函数参数、返回数据、返回地址,是在程序进行编译时就已经分配的内存空间的,在函数返回时,栈将会被自动清除,这些操作由系统来完成,一般大家说的堆栈和栈是一样的。
  堆是内存中除了栈、全局变量区、代码区、寄存器以外的所有内存区域。由于heap在程序结束前是不会被清除的,因此heap的使用,要由程序员控制,比如new及delete操作。
  一个由c/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)― 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) ― 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)―,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
4、文字常量区―常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区―存放函数体的二进制代码。

3:const它允许你指定一种语义上的约束:一个特定的对象不应该被修改。而编译器将执行这一约束。它允许你通知编译器和其他程序员,某个值应该保持不变。
const的用法非常广泛,在类的外部,你可以将它用于全局或命名空间范围的常量,以及那些在文件、函数、模块范围内被声明为静态的对象。在类的内部,你可以将它用于静态和非静态 数据成员上。对于指针,你可以指定这个指针本身是const,或者它所指向的数据是const,或者两者都是,或者都不是。
如果 const 出现在星号左边,则指针指向的内容为常量;如果const出现在星号右边,则指针自身为常量;如果 const 出现在星号两边,则两者都为常量,但当指针指向的内容为常量时,一些人将 const 放在类型之前,另一些人将它放在类型之后星号之前,两者在意义上并没有区别。
const char *p;          指针p指向的内容为常量
char const *p;          指针p指向的内容为常量
char *const p;          指针p自身为常量
const char * const p ;  指针p指向的内容及指针p自身为常量




B2层 发表时间: 06-02-27 09:11

回复: air [airxmg]   论坛用户   登录
还没有学到!我是新手!

B3层 发表时间: 06-03-08 08:23

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号