学c语言学到了指针部分,看到书上举得例子,用指针运算来取数组元素,或者取指定字符串中的单个字符等等,但是我看c语言明明提供了下标取值这种语法,为什么还要用指针呢?他在实际项目中起什么作用?(或者说那种情况下需要程序员手动操作内存?求举个实际的,具有应用型的例子)
学c语言学到了指针部分,看到书上举得例子,用指针运算来取数组元素,或者取指定字符串中的单个字符等等,但是我看c语言明明提供了下标取值这种语法,为什么还要用指针呢?他在实际项目中起什么作用?(或者说那种情况下需要程序员手动操作内存?求举个实际的,具有应用型的例子)
在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。
栈:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
堆:就是那些由 new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个 delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
自由存储区:就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。
全局/静态存储区:全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
常量存储区:这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改。
举一个简化的例子浏览图片, 在硬盘里的图片数据会先存到内存的堆中,这堆可以通过指针去访问堆中的地址进行图片的操作,关闭程序,相关堆中的内存释放。
其实很多书里关于指针说的都有些笼统,这样就会遇到你这种问题。
而且动态语言有了写多了,大家基本上不会去关心会变量会在栈里, 什么变量会在堆里了。
建议把内存模型这些知识补一补
不要着急,慢慢地你就发现指针多么有用了。数组一旦定义是定长的线性的,如果要求你存不定长的数据,你就不能用数组了吧?而用指针就能构造各种不定常的灵活的数据结构,比如线性链表,循环链表,广义表,十字链表(图的一种存储结构),邻接多重表等。还有函数指针,把它指向回调函数传给消息循环可以做很多事情啊。。。
所以,不着急,慢慢来,存在便有它的一些道理,慢慢学习发现就好了。上面列了很多名词,等你之后学数据结构就知道了。建议学有余力可以看看《C和指针》。
6 回答6.9k 阅读✓ 已解决
1 回答3.3k 阅读
1.1k 阅读
51 阅读
不用指针写个链表试试