欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文讀懂C++中指針和內(nèi)存分配

 更新時(shí)間:2021年06月22日 15:36:22   作者:劉潤(rùn)森!  
我們知道聲明的所有變量在內(nèi)存中都有一個(gè)特定的地址。聲明一個(gè)指針變量來(lái)指向內(nèi)存中的這些地址,這篇文章主要介紹了C++中指針和內(nèi)存分配,需要的朋友參考下吧

指針

指針是保存內(nèi)存位置地址的變量。我們知道聲明的所有變量在內(nèi)存中都有一個(gè)特定的地址。聲明一個(gè)指針變量來(lái)指向內(nèi)存中的這些地址。

聲明指針變量的一般語(yǔ)法是:

int p, *ptr; //聲明變量p和指針變量ptr
p = 4; //賦值4給變量p
ptr = &p; //將p的地址分配給指針變量ptr

在內(nèi)存中,這些聲明將表示如下:

在這里插入圖片描述

這是指針在內(nèi)存中的內(nèi)部表示。當(dāng)?shù)刂纷兞糠峙浣o指針變量時(shí),它指向的變量如上圖所示。

由于 ptr具有變量 p 的地址,*ptr 將給出變量 p 的值(指針變量 ptr 指向的變量)。

為什么需要 C++ 中的指針?為了解釋對(duì)指針的需要,有必要回到基本內(nèi)存布局。

在這里插入圖片描述

每當(dāng)執(zhí)行程序時(shí),程序指令都會(huì)駐留在代碼段中。并且所有的方法和數(shù)據(jù)都將駐留在堆棧中。代碼部分只能訪問堆棧部分,但不能直接訪問堆部分。

在這里插入圖片描述

注意:由于代碼段不能直接訪問堆段,所以不能直接使用堆內(nèi)存,會(huì)被浪費(fèi)掉,造成棧內(nèi)存溢出。

使用指針可以解決這個(gè)問題。指針為代碼部分提供了對(duì)堆內(nèi)存的間接訪問

在堆棧部分創(chuàng)建一個(gè)指針,該指針指向堆部分的內(nèi)存地址,從而間接訪問堆部分。

C++ 中使用指針的動(dòng)態(tài)內(nèi)存分配:

在堆部分分配內(nèi)存發(fā)生在運(yùn)行時(shí),而不是在編譯時(shí),因此分配堆內(nèi)存稱為動(dòng)態(tài)內(nèi)存分配。

一般來(lái)說(shuō),C++不會(huì)在堆中分配一個(gè)內(nèi)存,因?yàn)樵谑褂弥羔槙r(shí)通常會(huì)遇到的復(fù)雜性。所以只分配一個(gè)內(nèi)存塊,我們就要使用堆內(nèi)存,比如對(duì)于數(shù)組,我們會(huì)進(jìn)行動(dòng)態(tài)內(nèi)存分配。

在 C++ 中,new運(yùn)算符用于在運(yùn)行時(shí)分配內(nèi)存,內(nèi)存以字節(jié)為單位分配。該新操作符表示用于在堆動(dòng)態(tài)存儲(chǔ)器分配的請(qǐng)求。如果有足夠的內(nèi)存可用,則new運(yùn)算符初始化內(nèi)存并將新分配和初始化的內(nèi)存的地址返回給指針變量。

語(yǔ)法:

datatype *pointer_name = new datatype

具體例子

int *ptr = new int;//在動(dòng)態(tài)分配時(shí),我們可以通過以下兩種方式聲明一個(gè)變量。
int *ptr = new int (10);
int *ptr = new int {15};
// new運(yùn)算符還用于分配數(shù)據(jù)類型的內(nèi)存塊(數(shù)組)。
int *ptr = new int[20];
// 上面的語(yǔ)句為int類型的20個(gè)整數(shù)連續(xù)動(dòng)態(tài)分配內(nèi)存,并返回指向序列的第一個(gè)元素指向“ptr”指針。

一旦使用new關(guān)鍵字將堆內(nèi)存分配給變量或類對(duì)象,我們就可以使用delete關(guān)鍵字釋放該內(nèi)存空間。

動(dòng)態(tài)內(nèi)存分配概念的主要用途是通過指定其大小來(lái)聲明數(shù)組,但不確定它時(shí)將內(nèi)存分配給數(shù)組。

看一個(gè)例子來(lái)理解數(shù)組的內(nèi)存分配用法。

#include <iostream>
using namespace std;
int main()
{
    int len, sum = 0;
    cout << "Enter the no. of students in the class" << endl;
    cin >> len;
    int *marks = new int[len]; //Dynamic memory allocation
    cout << "Enter the marks of each student" << endl;
    for (int i = 0; i < len; i++)
    {
        cin >> *(marks + i);
    }
    for (int i = 0; i < len; i++)
    {
        sum += *(marks + i);
    }
    cout << "sum is " << sum << endl;
    return 0;
}

在代碼中,首先詢問用戶一個(gè)班級(jí)的學(xué)生人數(shù),并將其值存儲(chǔ)在 len 變量中。

然后聲明一個(gè)整數(shù)數(shù)組,并使用此語(yǔ)句在內(nèi)存中動(dòng)態(tài)分配等于 len 變量中存儲(chǔ)的值的空間 int *marks = new int[length];

因此它被分配了一個(gè)等于“長(zhǎng)度*(1個(gè)整數(shù)的大?。钡目臻g。

以上就是C++中指針和內(nèi)存分配的詳細(xì)內(nèi)容,更多關(guān)于C++指針內(nèi)存分配的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C++ 迭代器失效問題解決

    C++ 迭代器失效問題解決

    在C++中,當(dāng)一個(gè)vector進(jìn)行了插入或刪除操作時(shí),其迭代器可能會(huì)失效,本文就來(lái)介紹一下C++ 迭代器失效問題解決,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • Qt界面中滑動(dòng)條的實(shí)現(xiàn)方式

    Qt界面中滑動(dòng)條的實(shí)現(xiàn)方式

    這篇文章主要介紹了Qt界面中滑動(dòng)條的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 帶你分分鐘玩轉(zhuǎn)C語(yǔ)言指針

    帶你分分鐘玩轉(zhuǎn)C語(yǔ)言指針

    c語(yǔ)言指針其實(shí)是一個(gè)整形變量,與其它數(shù)據(jù)不同的是,它的作用是用來(lái)存儲(chǔ)其它變量的地址,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言指針的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • C++中的數(shù)組你真的理解了嗎

    C++中的數(shù)組你真的理解了嗎

    這篇文章主要為大家詳細(xì)介紹了C++的數(shù)組,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • 基于C中一個(gè)行壓縮圖的簡(jiǎn)單實(shí)現(xiàn)代碼

    基于C中一個(gè)行壓縮圖的簡(jiǎn)單實(shí)現(xiàn)代碼

    首先簡(jiǎn)單說(shuō)一下什么是行壓縮圖,其實(shí)嚴(yán)格意義上應(yīng)該是行壓縮矩陣
    2013-05-05
  • C語(yǔ)言進(jìn)程程序替換的實(shí)現(xiàn)詳解

    C語(yǔ)言進(jìn)程程序替換的實(shí)現(xiàn)詳解

    為什么要進(jìn)程替換?因?yàn)楦高M(jìn)程創(chuàng)建出來(lái)的子進(jìn)程和父進(jìn)程擁有相同的代碼段,所以,子進(jìn)程看到的代碼和父進(jìn)程是一樣的。當(dāng)我們想要讓子進(jìn)程執(zhí)行不同的程序時(shí)候,就需要讓子進(jìn)程調(diào)用進(jìn)程程序替換的接口,從而讓子進(jìn)程執(zhí)行不一樣的代碼
    2022-08-08
  • C++中訪問權(quán)限的示例詳解

    C++中訪問權(quán)限的示例詳解

    C++通過 public、protected、private 三個(gè)關(guān)鍵字來(lái)控制成員變量和成員函數(shù)的訪問權(quán)限(也稱為可見性),下面這篇文章主要給大家介紹了關(guān)于C++中訪問權(quán)限的相關(guān)資料,需要的朋友可以參考下
    2021-07-07
  • C++淺拷貝與深拷貝及引用計(jì)數(shù)分析

    C++淺拷貝與深拷貝及引用計(jì)數(shù)分析

    這篇文章主要介紹了C++淺拷貝與深拷貝及引用計(jì)數(shù)分析的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • 使用C語(yǔ)言如何輸出逆序數(shù)

    使用C語(yǔ)言如何輸出逆序數(shù)

    逆序數(shù)的就是把一個(gè)數(shù)倒過來(lái),例如:1234那么它的逆序數(shù)就為4321,我們?cè)撊绾问菍?shí)現(xiàn)呢?下面這篇文章主要給大家介紹了關(guān)于使用C語(yǔ)言如何輸出逆序數(shù)的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • Qt編寫自定義控件實(shí)現(xiàn)抽獎(jiǎng)轉(zhuǎn)盤

    Qt編寫自定義控件實(shí)現(xiàn)抽獎(jiǎng)轉(zhuǎn)盤

    這篇文章主要為大家詳細(xì)介紹了Qt編寫自定義控件實(shí)現(xiàn)抽獎(jiǎng)轉(zhuǎn)盤,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06

最新評(píng)論