中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

石家莊+網(wǎng)站建設(shè)近期的時事熱點或新聞事件

石家莊+網(wǎng)站建設(shè),近期的時事熱點或新聞事件,哈爾濱網(wǎng)頁設(shè)計學(xué)校,crm客戶管理系統(tǒng)論文內(nèi)存分區(qū)、引用 文章目錄 內(nèi)存分區(qū)、引用前言1 內(nèi)存分區(qū)模型1.1 程序運行前1.2 程序運行后1.3 new 操作符 2 引用2.1 引用基本使用2.2 引用注意事項2.3 引用做函數(shù)參數(shù)2.4 引用做函數(shù)返回值2.5 引用本質(zhì)2.6 常量引用 總結(jié) 前言 本文包含內(nèi)存分區(qū)、引用基本使用、引用注意事項、…

內(nèi)存分區(qū)、引用


文章目錄

  • 內(nèi)存分區(qū)、引用
  • 前言
    • 1 內(nèi)存分區(qū)模型
      • 1.1 程序運行前
      • 1.2 程序運行后
      • 1.3 new 操作符
    • 2 引用
      • 2.1 引用基本使用
      • 2.2 引用注意事項
      • 2.3 引用做函數(shù)參數(shù)
      • 2.4 引用做函數(shù)返回值
      • 2.5 引用本質(zhì)
      • 2.6 常量引用
  • 總結(jié)


前言

本文包含內(nèi)存分區(qū)、引用基本使用、引用注意事項、引用做函數(shù)參數(shù)、引用做函數(shù)返回值、引用本質(zhì)、常量引用。


1 內(nèi)存分區(qū)模型

C++程序在執(zhí)行時,將內(nèi)存大方向劃分為4個區(qū)域

(1)、代碼區(qū):存放函數(shù)體的二進制代碼,由操作系統(tǒng)進行管理的

(2)、全局區(qū):存放全局變量和靜態(tài)變量以及常量

(3)、棧區(qū):由編譯器自動分配釋放,存放函數(shù)的參數(shù)值,局部變量等

(4)堆區(qū):由程序員分配和釋放,若程序員不釋放,程序結(jié)束時由操作系統(tǒng)回收

內(nèi)存四區(qū)意義:

不同區(qū)域存放的數(shù)據(jù),賦予不同的生命周期,給我們更大的靈活編程

1.1 程序運行前

在程序編譯后,生成了exe可執(zhí)行程序,未執(zhí)行該程序前分為兩個區(qū)域

代碼區(qū):

(1)、存放 CPU 執(zhí)行的機器指令

(2)、代碼區(qū)是共享的,共享的目的是對于頻繁被執(zhí)行的程序,只需要在內(nèi)存中有一份代碼即可

(3)、代碼區(qū)是只讀的,使其只讀的原因是防止程序意外地修改了它的指令

全局區(qū):

(1)、全局變量和靜態(tài)變量存放在此

(2)、全局區(qū)還包含了常量區(qū),字符串常量和其他常量也存放在此

該區(qū)域的數(shù)據(jù)在程序結(jié)束后由操作系統(tǒng)釋放

// c-const   g-global   l-local(局部)#include <iostream>  // 包含標準輸入輸出流文件
using namespace std;  // 使用標準命名空間// 全局變量
int g_a = 10;
int g_b = 10;// 全局常量
const int c_g_a = 10;
const int c_g_b = 10;int main() {// 局部變量int a = 10;int b = 10;// 打印地址cout << "局部變量a地址為: " << (int)&a << endl;  // 5961520:棧區(qū)cout << "局部變量b地址為: " << (int)&b << endl;  // 5961508cout << endl;cout << "全局變量g_a地址為: " << (int)&g_a << endl;  // 10272820:全局區(qū)cout << "全局變量g_b地址為: " << (int)&g_b << endl;  // 10272824cout << endl;// 靜態(tài)變量;在普通變量前面加static,屬于靜態(tài)變量static int s_a = 10;static int s_b = 10;cout << "靜態(tài)變量s_a地址為: " << (int)&s_a << endl;  // 10272828cout << "靜態(tài)變量s_b地址為: " << (int)&s_b << endl;  // 10272832cout << endl;// 字符串常量cout << "字符串常量地址為: " << (int)&"hello world" << endl;  // 10263396cout << "字符串常量地址為: " << (int)&"hello world1" << endl;  // 10263404cout << endl;// const 修飾的常量// const 修飾的全局常量cout << "全局常量c_g_a地址為: " << (int)&c_g_a << endl;  // 10264208cout << "全局常量c_g_b地址為: " << (int)&c_g_b << endl;  // 10264212cout << endl;// const 修飾的局部常量const int c_l_a = 10;const int c_l_b = 10;cout << "局部常量c_l_a地址為: " << (int)&c_l_a << endl;  // 5961496:棧區(qū)cout << "局部常量c_l_b地址為: " << (int)&c_l_b << endl;  // 5961484cout << endl;system("pause");  // 相當(dāng)于在本地 Windows 調(diào)試器中的:請按任意鍵繼續(xù)...;暫停,方便看清楚輸出結(jié)果return 0;  // 程序正常退出
}

在這里插入圖片描述

在這里插入圖片描述

1.2 程序運行后

棧區(qū):

(1)、由編譯器自動分配釋放, 存放函數(shù)的參數(shù)值,局部變量等

(2)、注意事項:不要返回局部變量的地址,棧區(qū)開辟的數(shù)據(jù)由編譯器自動釋放

#include <iostream>  // 包含標準輸入輸出流文件
using namespace std;  // 使用標準命名空間// 棧區(qū)數(shù)據(jù)注意事項:不要返回局部變量的地址
// 棧區(qū)的數(shù)據(jù)由編譯器管理和釋放int* func(int b)  // int類型的指針,代表int類型的地址;形參數(shù)據(jù)也會放在棧區(qū)
{b = 100;int a = 10;  // 局部變量;存放在棧區(qū),棧區(qū)的數(shù)據(jù)在函數(shù)執(zhí)行完后自動釋放return &a;   // 返回局部變量的地址
}int main() {// 利用指針,接收func函數(shù)的返回值,指針指向a數(shù)據(jù)地址int* p = func(1);cout << *p << endl;  // 10;*解引用        // 第一次可以打印正確的數(shù)字,是因為編譯器做了保留cout << *p << endl;  // 267955168(亂碼)   // 第二次這個數(shù)據(jù)就不再保留了system("pause");  // 相當(dāng)于在本地 Windows 調(diào)試器中的:請按任意鍵繼續(xù)...;暫停,方便看清楚輸出結(jié)果return 0;  // 程序正常退出
}

堆區(qū):

(1)、由程序員分配釋放,若程序員不釋放,程序結(jié)束時由操作系統(tǒng)回收

(2)、在C++中主要利用new在堆區(qū)開辟內(nèi)存

#include <iostream>  // 包含標準輸入輸出流文件
using namespace std;  // 使用標準命名空間int* func()
{// 利用new關(guān)鍵字,可以將數(shù)據(jù)開辟到堆區(qū)// 指針本質(zhì)也是局部變量,放在棧上,指針保存的數(shù)據(jù)是放在堆區(qū)int* a = new int(10);  // 返回內(nèi)存編號地址;存放的也是地址;new int(10)return a;
}int main() {int* p = func();cout << *p << endl;  // 10cout << *p << endl;  // 10system("pause");  // 相當(dāng)于在本地 Windows 調(diào)試器中的:請按任意鍵繼續(xù)...;暫停,方便看清楚輸出結(jié)果return 0;  // 程序正常退出
}

1.3 new 操作符

(1)、C++ 中利用 new 操作符在堆區(qū)開辟數(shù)據(jù)

(2)、堆區(qū)開辟的數(shù)據(jù),由程序員手動開辟,手動釋放,釋放利用操作符 delete

(3)、語法: new 數(shù)據(jù)類型

(4)、利用 new 創(chuàng)建的數(shù)據(jù),會返回該數(shù)據(jù)對應(yīng)的類型的指針

示例1: 基本語法

#include <iostream>  // 包含標準輸入輸出流文件
using namespace std;  // 使用標準命名空間int* func()
{// 利用new關(guān)鍵字,可以將數(shù)據(jù)開辟到堆區(qū)// 指針本質(zhì)也是局部變量,放在棧上,指針保存的數(shù)據(jù)是放在堆區(qū)int* a = new int(10);  // 返回內(nèi)存編號地址;存放的也是地址;new int(10)return a;
}int main() {int* p = func();  // 10cout << *p << endl;  // 10cout << *p << endl;  // 10// 堆區(qū)的數(shù)據(jù),由程序員管理開辟,程序員管理釋放delete p;  // 利用delete釋放堆區(qū)數(shù)據(jù)// cout << *p << endl; //報錯,釋放的空間不可訪問;內(nèi)存已被釋放,再次訪問就是非法操作,會報錯system("pause");  // 相當(dāng)于在本地 Windows 調(diào)試器中的:請按任意鍵繼續(xù)...;暫停,方便看清楚輸出結(jié)果return 0;  // 程序正常退出
}

示例2:開辟數(shù)組

#include <iostream>  // 包含標準輸入輸出流文件
using namespace std;  // 使用標準命名空間int main() {int* arr = new int[10];  // 10代表數(shù)組有10個元素for (int i = 0; i < 10; i++){arr[i] = i + 100;  // 給10個元素賦值 100~109}for (int i = 0; i < 10; i++){cout << arr[i] << " ";}cout << endl;// 釋放數(shù)組 delete 后加 []delete[] arr;cout << endl;system("pause");  // 相當(dāng)于在本地 Windows 調(diào)試器中的:請按任意鍵繼續(xù)...;暫停,方便看清楚輸出結(jié)果return 0;  // 程序正常退出
}

在這里插入圖片描述

2 引用

2.1 引用基本使用

**作用: ** 給變量起別名

語法: 數(shù)據(jù)類型 &別名 = 原名

在這里插入圖片描述

#include <iostream>  // 包含標準輸入輸出流文件
using namespace std;  // 使用標準命名空間int main() {int a = 10;// 數(shù)據(jù)類型 &別名 = 原名int& b = a;cout << "a = " << a << endl;  // 10cout << "b = " << b << endl;  // 10b = 100;cout << "a = " << a << endl;  // 100cout << "b = " << b << endl;  // 100cout << endl;system("pause");  // 相當(dāng)于在本地 Windows 調(diào)試器中的:請按任意鍵繼續(xù)...;暫停,方便看清楚輸出結(jié)果return 0;  // 程序正常退出
}

在這里插入圖片描述

2.2 引用注意事項

(1)、引用必須初始化

(2)、引用在初始化后,不可以改變

在這里插入圖片描述

#include <iostream>  // 包含標準輸入輸出流文件
using namespace std;  // 使用標準命名空間int main() {int a = 10;int b = 20;// int &c;   // 錯誤,引用必須初始化int& c = a;  // 一旦初始化后,就不可以更改c = b;       // 這是賦值操作,不是更改引用cout << "a = " << a << endl;  // 20cout << "b = " << b << endl;  // 20cout << "c = " << c << endl;  // 20cout << endl;system("pause");  // 相當(dāng)于在本地 Windows 調(diào)試器中的:請按任意鍵繼續(xù)...;暫停,方便看清楚輸出結(jié)果return 0;  // 程序正常退出
}

在這里插入圖片描述

2.3 引用做函數(shù)參數(shù)

作用: 函數(shù)傳參時,可以利用引用的技術(shù)讓形參修飾實參

優(yōu)點: 可以簡化指針修改實參

#include <iostream>  // 包含標準輸入輸出流文件
using namespace std;  // 使用標準命名空間// 1、值傳遞
void mySwap01(int a, int b) {int temp = a;a = b;b = temp;
}// 2、地址傳遞
void mySwap02(int* a, int* b) {  // 傳值使用&取值符,接收時用指針*int temp = *a;*a = *b;*b = temp;
}// 3、引用傳遞
void mySwap03(int& a, int& b) {  // 引用,&a相當(dāng)于實參a的別名,別名與原名一致,修改別名a就相當(dāng)于修改aint temp = a;a = b;b = temp;
}int main() {int a = 10;int b = 20;mySwap01(a, b);  // 值傳遞,形參不會修飾實參cout << "a:" << a << " \tb:" << b << endl;  // a:10 b:20mySwap02(&a, &b);  // 地址傳遞,形參會修飾實參cout << "a:" << a << " \tb:" << b << endl;  // a:20 b:10mySwap03(a, b);  // 引用傳遞,形參會修飾實參cout << "a:" << a << " \tb:" << b << endl;  // a:20 b:10 因為mySwap02()將實參修改了,在mySwap02()的基礎(chǔ)上再進行更換cout << endl;system("pause");  // 相當(dāng)于在本地 Windows 調(diào)試器中的:請按任意鍵繼續(xù)...;暫停,方便看清楚輸出結(jié)果return 0;  // 程序正常退出
}

在這里插入圖片描述

2.4 引用做函數(shù)返回值

作用: 引用是可以作為函數(shù)的返回值存在的

注意: 不要返回局部變量引用

用法: 函數(shù)調(diào)用作為左值

#include <iostream>  // 包含標準輸入輸出流文件
using namespace std;  // 使用標準命名空間// 返回局部變量引用
int& test01() {int a = 10;  // 局部變量;存放在四區(qū)中的棧區(qū);函數(shù)調(diào)用后將被釋放return a;
}// 返回靜態(tài)變量引用
int& test02() {static int a = 20;  // 靜態(tài)變量,存放在全局區(qū),全局區(qū)上的數(shù)據(jù)在程序結(jié)束后系統(tǒng)釋放return a;
}int main() {// 不能返回局部變量的引用int& ref = test01();cout << "ref = " << ref << endl;cout << "ref = " << ref << endl;int& ref2 = test02();cout << "ref2 = " << ref2 << endl;  // 20cout << "ref2 = " << ref2 << endl;  // 20// 如果函數(shù)做左值,那么必須返回引用// 如果函數(shù)的返回值是引用,這個函數(shù)調(diào)用可以作為左值test02() = 1000;  // test02()調(diào)用后返回的是a的引用;相當(dāng)于返回a這個變量;test02()返回的就是a的本身;相當(dāng)于a=1000cout << "ref2 = " << ref2 << endl;  // 1000 ; ref2是a的別名;原名賦值為1000,使用別名ref2訪問也是1000cout << "ref2 = " << ref2 << endl;  // 1000cout << endl;system("pause");  // 相當(dāng)于在本地 Windows 調(diào)試器中的:請按任意鍵繼續(xù)...;暫停,方便看清楚輸出結(jié)果return 0;  // 程序正常退出
}

在這里插入圖片描述

2.5 引用本質(zhì)

本質(zhì): 引用的本質(zhì)在c++內(nèi)部實現(xiàn)是一個指針常量 (int * const p)

#include <iostream>  // 包含標準輸入輸出流文件
using namespace std;  // 使用標準命名空間// 發(fā)現(xiàn)是引用,轉(zhuǎn)換為 int* const ref = &a;
void func(int& ref) {ref = 100;  // ref是引用,轉(zhuǎn)換為*ref = 100
}int main() {int a = 10;// 自動轉(zhuǎn)換為 int* const ref = &a; 指針常量是指針指向不可改,也說明為什么引用不可更改(指向a地址后,不可再指向b地址)int& ref = a;ref = 20;  // 內(nèi)部發(fā)現(xiàn)ref是引用,自動幫我們轉(zhuǎn)換為: *ref = 20;解引用cout << "a:" << a << endl;      // 20cout << "ref:" << ref << endl;  // 20cout << endl;system("pause");  // 相當(dāng)于在本地 Windows 調(diào)試器中的:請按任意鍵繼續(xù)...;暫停,方便看清楚輸出結(jié)果return 0;  // 程序正常退出
}

在這里插入圖片描述

在這里插入圖片描述

結(jié)論:C++推薦用引用技術(shù),因為語法方便,引用本質(zhì)是指針常量,但是所有的指針操作編譯器都幫我們做了

2.6 常量引用

作用: 常量引用主要用來修飾形參,防止誤操作

在函數(shù)形參列表中,可以加 const修飾形參,防止形參改變實參

// 引用使用的場景,通常用來修飾形參#include <iostream>  // 包含標準輸入輸出流文件
using namespace std;  // 使用標準命名空間// 打印數(shù)據(jù)函數(shù)
void showValue(const int& v) {  // const修飾形參;形參引用//v += 10;  // 加const后,v的值不可修改會提示錯誤cout << v << endl;
}int main() {//int& ref = 10;  // 引用本身需要一個合法的內(nèi)存空間(棧區(qū)、堆區(qū)數(shù)據(jù)),因此這行錯誤;10是常量,在常量區(qū)// 加入const就可以了,編譯器優(yōu)化代碼,int temp = 10; const int& ref = temp;const int& ref = 10;// ref = 100;  //加入const后不可以修改變量;變?yōu)橹蛔xcout << ref << endl;  // 10// 函數(shù)中利用常量引用防止誤操作修改實參int a = 10;  // 如果函數(shù)showValue()未加const,在函數(shù)內(nèi)修改v,會將a的值也進行修改showValue(a);  // 10cout << endl;system("pause");  // 相當(dāng)于在本地 Windows 調(diào)試器中的:請按任意鍵繼續(xù)...;暫停,方便看清楚輸出結(jié)果return 0;  // 程序正常退出
}

在這里插入圖片描述


總結(jié)

(1)、C++ 中在程序運行前分為全局區(qū)和代碼區(qū);

(2)、代碼區(qū)特點是共享和只讀;

(3)、全局區(qū)中存放全局變量、靜態(tài)變量、常量;

(4)、常量區(qū)中存放 const 修飾的全局常量和字符串常量;

(5)、堆區(qū)數(shù)據(jù)由程序員管理開辟和釋放;

(6)、堆區(qū)數(shù)據(jù)利用new關(guān)鍵字進行開辟內(nèi)存;

(7)、通過引用參數(shù)產(chǎn)生的效果同按地址傳遞是一樣的。引用的語法更清楚簡單。

http://www.risenshineclean.com/news/41672.html

相關(guān)文章:

  • 南京高端網(wǎng)站建設(shè)公司網(wǎng)絡(luò)廣告一般是怎么收費
  • 圖書館 網(wǎng)站建設(shè)2022拉人頭最暴利的app
  • 海南建設(shè)銀行官方網(wǎng)站縱橫seo
  • 濟南哪家公司做網(wǎng)站微信指數(shù)是搜索量嗎
  • 怎么做wordpress主題模板福州seo網(wǎng)絡(luò)推廣
  • 刷qq會員自己做網(wǎng)站杭州正規(guī)引流推廣公司
  • 石家莊做網(wǎng)站建設(shè)的公司排名百度公司的發(fā)展歷程
  • 免費網(wǎng)站制作公司優(yōu)化網(wǎng)站排名軟件
  • 女子醫(yī)院網(wǎng)站設(shè)計怎么做欒城seo整站排名
  • 用rp怎么做網(wǎng)站按鈕下拉菜單免費發(fā)廣告的網(wǎng)站大全
  • 網(wǎng)站建設(shè)排期什么是網(wǎng)站推廣?
  • 福州網(wǎng)站建設(shè)哪家好班級優(yōu)化大師免費下載安裝
  • 政府網(wǎng)站html5媒體平臺
  • 動態(tài)網(wǎng)站商品瀏覽怎么做seo流量排名軟件
  • 注冊深圳公司的好處惠州抖音seo策劃
  • 網(wǎng)站后臺無法審核怎么把網(wǎng)站排名排上去
  • 近期新冠感染情況吉林網(wǎng)站seo
  • 阿里云域名怎樣做網(wǎng)站百度直播推廣
  • 電商網(wǎng)站建設(shè)流程推廣方案是什么
  • 建設(shè)銀行論壇網(wǎng)站廈門seo搜索引擎優(yōu)化
  • xp做網(wǎng)站服務(wù)器seo創(chuàng)業(yè)
  • asp.net網(wǎng)站開發(fā)流程手機維修培訓(xùn)班學(xué)校
  • 合肥企業(yè)做網(wǎng)站app制作費用一覽表
  • 網(wǎng)站改版原則惠城網(wǎng)站設(shè)計
  • 什么軟件做高級網(wǎng)站網(wǎng)絡(luò)推廣企業(yè)
  • 微信小程序開發(fā)技術(shù)棧c盤優(yōu)化大師
  • 網(wǎng)站關(guān)鍵詞推廣方案國產(chǎn)長尾關(guān)鍵詞拘挖掘
  • 張家口網(wǎng)站開發(fā)電子商務(wù)網(wǎng)站有哪些?
  • 網(wǎng)站面包屑導(dǎo)航設(shè)計即位置導(dǎo)航青島網(wǎng)絡(luò)科技公司排名
  • 互聯(lián)網(wǎng)裝修服務(wù)平臺成都網(wǎng)站優(yōu)化及推廣