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.pswp.cn/news/444834.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/444834.shtml
英文地址,請注明出處:http://en.pswp.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]&#…