C++(10)--动态分配内存new,程序的内存分配

动态分配内存

  • 1. 动态分配内存
    • 1.1使用new分配内存
    • 1.2使用delete释放内存
    • 1.3使用new创建动态分配的数组
  • 2. 程序的内存分配
  • 3.数组与指针案例实践
  • 4.二维数组与指针

《老九学堂C++课程》《C++ primer》学习笔记。《老九学堂C++课程》详情请到B站搜索《老九零基础学编程C++入门》
-------------简单的事情重复做,重复的事情用心做,用心的事情坚持做(老九君)---------------

1. 动态分配内存

1.1使用new分配内存

指针真正的用处在于:在运行阶段分配未命名的内存以存储值(在这种情况下只能通过指针来访问内存)

1.2使用delete释放内存

不要释放已经释放变量的内存
也不要释放一般变量的内存
新版本时,对空指针delete是安全的

int *ptr = new int; // ptr-栈区,int 在堆区分配了一块int型的空间
ptr ++; // 这个操作很危险,使得上面的Int的型空间没人管了,内存泄漏
delete ptr;

编译时:编译的时候就确定下来的空间 int nums[56];
运行时:运行的时候才会确定下来的空间 int *nums = new int[56];

注意不要定义两个指向同一块内存空间的指针,避免删除两次同一块地址空间。

1.3使用new创建动态分配的数组

int *intArray = new int[10]; // new 返回第一个元素的地址
delete [] intArray;

2. 程序的内存分配

栈区(stack):先进后出,表面速度非常快
由编译器自动分配释放,一般存放函数的参数,局部变量的值。操作方式类似于数据结构中的栈。

堆区(heap)–实际的实现是堆区在做
一般由程序员分配释放,若不释放,程序结束时可能由操作系统回收。于数据结构中的堆是两回事,分配方式有点像链表。

全局区(静态区-static)
全局变量和静态变量是存放在一起的,程序结束后由系统释放

文字常量区–常量字符串放在这里,程序结束时由系统释放

程序代码区–存放函数体的二进制代码

int num2 = 0; // 全局变量初始化
int *ptr;     // 全局未初始化区
int main(){int num2;  // 栈区char str[] = "lalala"; // 栈区char *ptr2 // 栈区char *ptr3 = "lalalala" // ptr3 栈区, lalala\0常量区static int num3 = 1024; // 全局静态初始化ptr1 = new int[10];     // 分配的内存堆区, ptr1,ptr2 本身在栈区ptr2 = new char[20];    // 分配的内存堆区return 0}

3.数组与指针案例实践

demo1: 一般不要移动指针,移动指针很危险

int main(){int arrays[] = {15, 23, 30, 40, 50};int *ptr_arrays = arrays;     //数组名存放数组首地址,所以不需要再取地址符号for(int i = 0; i < 5; i++){cout << *ptr_arrays++ << endl;//推荐 cout << *(ptr_array+i) << endl;}for(int i = 0; i < 5; i++){cout << *ptr_arrays++ << endl;}return 0;
}

输出

15
23
30
40
50
32766
1616969936
469956749
-472074792
32766

demo2: 指针实现数组元素的逆序

int main(){int arrays[] = {15, 23, 30, 40, 50, 60};int *ptr_start = arrays;int *ptr_end = arrays + 5;int tmp;while(ptr_start < ptr_end){tmp = *ptr_start;*ptr_start = *ptr_end;*ptr_end = tmp;ptr_start++;ptr_end--;}for(int i = 0; i < 6; i++){cout << arrays[i] << '\t';}return 0;
}

输出

60      50      40      30      23      15     

4.二维数组与指针

首地址:

&a[0][0]

使用指针访问二维数组中的元素

*(a[1] + 2)
*(*(a+1))

使用指针创建二维数组

int *p = new int[10];
int main(){int (*p2)[3] = new int[5][3];    // 将第一维度定位为指针向量p2[3][2] = 2021;for(int i = 0; i < 5; i++){for(int j = 0; j < 3; j++){// cout << p2[i][j] << ',' ;cout << *(*(p2+i)+j) << ',';}cout << endl;}// 二维数组指针就是存放数组第一维度元素地址的向量int arrays[5][3] ={{1,2,3},{4,5,6},{7,8,9},{1,2,3},{4,5,6}};int (*p3)[3] = arrays;cout << &arrays[1][0] << endl;for(int i = 0; i < 5; i++){cout << p3 + i << endl;}return 0;
}
0,0,0,
0,0,0,
0,0,0,
0,0,2021,
0,0,0,
0x7ffee5d5857c
0x7ffee5d58570
0x7ffee5d5857c
0x7ffee5d58588
0x7ffee5d58594
0x7ffee5d585a0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/444834.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

社交app应用开发 客户端+服务器源码

原帖地址&#xff1a;http://www.devdiv.com/iOS_iPhone-想学习移动社交APP的童鞋有福了&#xff0c;图文展示&#xff0c;附客户端&#xff0c;服务端源码。-thread-121444-1-1.html 想学习移动社交APP的童鞋有福了&#xff0c;图文展示&#xff0c;附客户端&#xff0c;服务…

leetcode83 删除排序链表中的重复元素

给定一个排序链表&#xff0c;删除所有重复的元素&#xff0c;使得每个元素只出现一次。 示例 1: 输入: 1->1->2 输出: 1->2 示例 2: 输入: 1->1->2->3->3 输出: 1->2->3 思路&#xff1a;判断下一个是否相同即可。 /*** Definition for singl…

tcpdump的用法

第一种是关于类型的关键字&#xff0c;主要包括host&#xff0c;net&#xff0c;port, 例如 host 210.27.48.2&#xff0c;指明 210.27.48.2是一台主机&#xff0c;net 202.0.0.0 指明 202.0.0.0是一个网络地址&#xff0c;port 23 指明端口号是23。如果没有指定类型&#xff0…

关于NFS服务器的原理总结和mount挂载

NFS 是Network File System的缩写,即网络文件系统。一种使用于分散式文件系统的协定,由Sun公司开发,于1984年向外公布。功能是通过网络让不同的机器、不同的操作系统能够彼此分享个别的数据,让应用程序在客户端通过网络访问位于服务器磁盘中的数据,是在类Unix系统间实现磁…

leetcode203 移除链表元素

删除链表中等于给定值 val 的所有节点。 示例: 输入: 1->2->6->3->4->5->6, val 6 输出: 1->2->3->4->5 思路&#xff1a;就删呗&#xff0c;注意第一个数可能会被删 /*** Definition for singly-linked list.* public class ListNode {* …

不需要安装max或者xcode的object C开发环境

有时候很多人在没有mac开发机的时候&#xff0c;都想着安装一个虚拟mac机&#xff0c;或者用codeblock去配置成一个OC开发环境&#xff0c;我之前在学习OC的时候就这么办过&#xff0c;虚拟机卡的要死&#xff0c;codeblock本来就不是专门用来做OC开发的&#xff0c;还要自己弄…

leetcode338 比特位计数

给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i &#xff0c;计算其二进制数中的 1 的数目并将它们作为数组返回。 示例 1: 输入: 2 输出: [0,1,1] 示例 2: 输入: 5 输出: [0,1,1,2,1,2] 进阶: 给出时间复杂度为O(n*sizeof(integer))的解答非常容易。但你可…

C++(11)--编程实践1-经典养成类游戏简单实践

经典养成类游戏简单实践-小公主养成记《老九学堂C课程》学习笔记。《老九学堂C课程》详情请到B站搜索《老九零基础学编程C入门》-------------简单的事情重复做&#xff0c;重复的事情用心做&#xff0c;用心的事情坚持做(老九君)---------------致敬&#xff1a;日本Gainax公司…

关于房屋的风水学整理

第一步&#xff1a;看缺角&#xff0c;根据户型图的整体形状分析有无缺角户型的形状很多&#xff0c;有三角形的&#xff0c;手枪形的&#xff0c;锯齿型的等等&#xff0c;总的来说缺角就不好&#xff0c;方方正正好&#xff0c;适合“天方地圆”。如下图什么是缺角&#xff0…

房屋凶吉位判断

房屋的吉凶位按八宅来判断比较适合自身简易的操作&#xff0c;但每个房屋&#xff0c;都是既有共性&#xff0c;也有个性的&#xff0c;具体的吉凶方位的判断&#xff0c;可能要用到家中每个人的年命、运程&#xff0c;房屋周边的山水形势及地理环境要素。这些内容&#xff0c;…

leetcode226 反转二叉树

翻转一棵二叉树。 示例&#xff1a; 输入&#xff1a; 4 / \ 2 7 / \ / \ 1 3 6 9 输出&#xff1a; 4 / \ 7 2 / \ / \ 9 6 3 1 备注: 这个问题是受到 Max Howell 的 原问题 启发的 &#xff1a; 谷歌&#xff1a;我们90&#xff05;的…

Linux(9)-Vim编辑器的使用

Vim编辑器的使用1.指令模式常用快捷键1.1 定位快捷键1.2 编辑快捷键1.3查找相关的快捷键2.行末模式常用命令2.1 文件操作命令3. 切换默认编辑器nano->vim4.tip4.1显示行号vim编辑器有3种工作模式&#xff1a;指令模式–依据快捷键对文本进行编辑–复制、黏贴、删除、查找输入…

微信app公众平台开发

http://www.cnblogs.com/txw1958/p/wechat-tutorial.html

用awk一些常用技巧sort uniq

统计文件中第一列中同一IP出现的次数cat test123.122.123.12 12121212121.2332.121.11 232323255.255.255.255 21321123.122.123.12 12121212123.122.123.12 1212121er2123.122.123.12 12121212eer123.122.123.12 12121212ere255.255.255.255 21321121.2332.121.11 232323255.2…

leetcode234 回文链表

请判断一个链表是否为回文链表。 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶&#xff1a; 你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题&#xff1f; 思路&#xff1a;逆置前一半&#xff0c;然后从中心出发开始比较即…

mysql导入source数据库sql的C++实现和封装

之前有好多人在为这件事情头疼不已: 想有一个不需要安装mysql客户端就可以导入数据库脚本,但找不到对应的api调用。所以得需要自己去实现导入数据库的实现方法: common.h #ifndef _COMMON_H #define _COMMON_H #ifdef WIN32#include <winsock2.h>typedef __int8 …

C++(12)--函数基础:按值传递、传递数组、函数指针

模块化编程--函数1. 函数基本知识2. 函数的参数2.1 按值传递机制&#xff08;小议按引用传递&#xff09;2.2 使用数组做函数参数&#xff08;用户头文件&#xff0c;const的防改&#xff09;2.3 使用二维数组作为函数的参数2.4 使用函数指针作为函数的参数2.4.1 函数指针的基本…

关于关闭SELinux的方法

原贴:http://www.diybl.com/course/6_system/linux/Linuxjs/2008629/129166.html关闭SELinux的方法&#xff1a;修改/etc/selinux/config文件中的SELINUX"" 为 disabled &#xff0c;然后重启。如果不想重启系统&#xff0c;使用命令setenforce 0注&#xff1a;seten…

leetcode739 每日温度

根据每日 气温 列表&#xff0c;请重新生成一个列表&#xff0c;对应位置的输入是你需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高&#xff0c;请在该位置用 0 来代替。 例如&#xff0c;给定一个列表 temperatures [73, 74, 75, 71, 69, 72, 76, 73]&#…