1. 程式人生 > >C++面試題四---指標和引用的關係

C++面試題四---指標和引用的關係

指標和引用的關係

https://blog.csdn.net/qq_27678917/article/details/70224813
指標和引用的關係:引用是變數的別名,可以將引用看做是操作受限的指標
1、 性質上的區別:
a、指標是一個變數,只不過這個變數儲存的是一個地址,指向記憶體的一個儲存單元;而引用跟原來的變數實質上是同一個東西,只不過是原變數的一個別名而已(佔用同一個儲存單元)。
b、引用不可以為空,當被建立的時候,必須初始化,而指標可以是空值,可以在任何時候被初始化。
c、指標可以有const指標,但是沒有const引用
d、指標可以有多級,但是引用只能有一級
e、指標的值可以為空,但是引用的值不能為NULL,並且引用在定義時必須初始化
f、指標的值在初始化以後可以改變,指向其他的儲存單元,而引用在初始化後就不能更改
g、sizeof“引用”得到的是所指向的變數的大小,sizeof”指標”得到的是指標本身的大小(如果是int *p,則sizeof p 32位中得到是4)
h、指標和引用的自增運算不一樣(指標的自增1是其指向的地址增加一個物件型別大小,指向下一個記憶體地址;引用的自增是對引用值的自增)
i、如果返回動態記憶體分配的物件或者記憶體,必須使用指標,使用引用可能引起記憶體洩漏
2、 作為函式引數進行傳遞時的區別


使用指標傳遞引數,可以實現對實參進行改變的目的,是因為傳遞過來的是實參的地址,因此使用*a實際上是取儲存實參的記憶體單元裡的資料,即是對實參進行改變,因此可以達到目的,當把指標作為引數進行傳遞時,也是將實參的一個拷貝傳遞給形參。
在將引用作為函式引數進行傳遞時,實質上傳遞的是實參本身,即傳遞進來的不是實參的一個拷貝,因此對形參的修改其實是對實參的修改,所以在用引用進行引數傳遞時,不僅節約時間,而且可以節約空間。

C++程式的記憶體分割槽

https://blog.csdn.net/qq_22080999/article/details/81022508
1、 分割槽
在C++中,記憶體分為5個區:堆區、棧區、全域性區(靜態區)、文字常量區、程式程式碼區
棧區stack:由編譯器自動分配和釋放,存放函式的引數值、區域性變數的值等、其操作類似於資料結構中的棧。
堆區heap:一般由程式設計師分配和釋放,若程式設計師不釋放,程式結束時可能由作業系統回收。它與資料結構中的堆是兩回事,分配方式倒是類似於連結串列。(malloc/free,new/delete)
全域性區(靜態區)static:全域性變數和靜態變數的儲存時放在一塊的,初始化的全域性變數和靜態變數在一塊區域,未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。程式結束後由系統釋放。
文字常量區:常量字串放在這裡。程式結束後由系統釋放。
程式程式碼區:存放函式體的二進位制程式碼。

int a = 0;//全域性初始化區
char *p1;//全域性未初始化區
main()
{
    int b;//棧
    char s[] = "abc";//棧
    char *p2;//棧
    char *p3 = "123456";//123456在常量區,p3在棧上
    static int c = 0;//全域性(靜態)初始化區
    p1 = (char*)malloc(10);
    p2 = (char*)malloc(20);//分配的10位元組和20位元組的區域在堆區
    strcpy(p1, "123456");//123456放在常量區,編譯器可能把它和p3指向的123456優化成一個地方
}

2、 堆和棧的區別
1) 堆和棧中的儲存內容:棧存區域性變數、函式引數等。堆儲存使用new、malloc申請的變數等;
2) 申請方式:棧由系統自動分配;堆需要程式設計師自己申請,並指明大小,用malloc或new
3) 申請後系統的響應:棧:只要棧的剩餘空間大於所申請,系統將為程式提供記憶體,否則將報異常提示棧溢位;
堆:當系統收到程式的申請時,會遍歷連結串列,尋找第一個空間大於所申請空間的堆節點,然後將該節點從空閒節點連結串列中刪除,並將該節點的空間分配給程式。系統會自動地將多餘的那部分重新放入空閒連結串列中。
4) 申請大小的限制:
棧:在Windows下,棧的大小是2MB(編譯時就確定的常數),如果申請的空間超過棧的剩餘空間,將提示overflow。
堆:堆是是不連續的記憶體區域。獲得的空間較靈活,也較大。
5) 申請效率比較:
棧:由系統自動分配,速度較快。但程式設計師無法控制
堆:是由new分配的記憶體,一般較慢,容易產生記憶體碎片,但用起來方便
總結:棧區優勢在於處理效率,堆區優勢在於靈活
3、 記憶體模型
C++中的記憶體模型有:自由區、靜態區、動態區;
根據c/c++物件生命週期不同,c/c++的記憶體模型有三種不同的記憶體區域,即:自由儲存區,動態區、靜態區。
自由儲存區:區域性非靜態變數的儲存區域,即平常所說的棧;
動態區: 用new ,malloc分配的記憶體,即平常所說的堆;
靜態區:全域性變數,靜態變數,字串常量存在的位置;
注:程式碼雖然佔記憶體,但不屬於c/c++記憶體模型的一部分;

相關推薦

C++試題---指標引用關係

指標和引用的關係 https://blog.csdn.net/qq_27678917/article/details/70224813 指標和引用的關係:引用是變數的別名,可以將引用看做是操作受限的指標 1、 性質上的區別: a、指標是一個變數,只

C++試題:listvector有什麼區別?

C++面試題:list和vector有什麼區別? 考點:理解list和vector的區別 出現頻率:★★★★ 解析: vector和陣列類似,它擁有一段連續的記憶體空間,並且起始地址不變,因此它能非常好的支援隨機存取(使用[]操作符訪問其中元素),但由於它的記憶體空間是連續的,所

C++試題一---StructClass的區別

C++中的struct對C中的struct進行了擴充,它已經不再只是一個包含不同資料型別的資料結構了,它已經獲取了太多的功能。 struct能包含成員函式嗎? 能! struct能繼承嗎? 能!! struct能實現多型嗎? 能!!! 既然這些它都能實現

C++中指標引用還有*&的關係

*是取值,&是取地址。 在函式定義宣告的時候按照谷歌規範,輸入是const &型別的,輸出是指標型別的。 在使用過程中如果輸入是上一個函式的輸出,在使用的時候需要使用&或者星號×指標進行處理。 在函式宣告過程中使用&表示引用,函式內對引數進行了修改外部也會發生

c++學習(過載、指標引用

所謂過載就是:函式名相同,引數不同(包括型別、數量、順序不同) 當我們呼叫函式的時候編譯器能夠通過函式引數的數量或者型別或者順序不同來選擇要呼叫那個函式。但是不能通過返回值的不一樣來過載函式。 #include <iostream> using namesp

[C++]指標引用

指標和引用 用指標處理連結串列 一、連結串列概述   連結串列是由一個個結點組成,每一個結點是一個結構體型別的變數,各個結點的型別相同,但其地址不一定連續。具體結點的個數根據需要動態開闢。 每個結點由

5、【C++】指標/引用指標引用的區別)

一、指標 int p=12; int *q; int *q=&p;     這裡p為int型別的變數,&p就是p的記憶體地址,*q是一個int型別的變數(是一個值),q為指標是地址,int q=&p;把p的地址賦給了指標q,所以q就

C++中指標引用的區別、以及引用取地址符&的區別

一. 指標和引用的區別 對於指標來說,它是一個地址,這個地址是一個數值,那麼就意味這個數值可以為0(空指標),也可以為其他,即指標可以不指向任何東西。 而對於引用來說,他是一個外號,外號一定是“某個存在物體”的外號,所以引用不能為空,即不能存在空引用。例如我們給小明起了個外號:明明,那我們說

C++11智慧指標引用

最近在學習課程的時候發現一個很困惑的問題,上程式碼 class DataHeader; class LoginResult:public DataHeader; typedef std::shared_ptr<DataHeader> DataHeaerPtr; //原型 void addS

劍指offer 試題41:為s的兩個數字vs為s的連續正數序列 c++

題目:輸入一個遞增排序的陣列和一個數字S,在陣列中查詢兩個數,使得他們的和正好是S,如果有多對數字的和等於S,輸出兩個數的乘積最小的。 思路:兩個 指標,start從前往後遍歷,end從後往前遍歷,如果當前前後之和大於s,end--,如果當前前後之和小於s,start++,這樣能找出乘積最小的和

初夏小談:C++中“指標引用“”的區別

1.引用只能繫結一個實體,而指標可以指向不同實體2.使用指標時要判空,而引用不需要因此更安全3.引用在定義時必須初始化,指標不做要求4.在sizeof中:引用結果是引用型別的大小,但指標始終是地址空間所佔位元組個數 void Size() { long long x =

c++ 中的指標引用

首先: 指標是儲存的變數的地址,引用是變數的別名,這個必須記住 單純的給變數取別名沒有任何的意義,作為引數傳遞,能保證引數傳遞過程中不產生任何的副本 引用可以直接操作變數,但指標的話必須通過(*p)間接的操作變數,指標可讀性行比較低 //引用必須要有初始值 //

C++試題之資料結構演算法

  C++面試題之資料結構和演算法 目錄 1、String原理及實現 2、連結串列的實現 2.1、順序連結串列 2.2、鏈式表 2.3、雙鏈表 2.4、迴圈連結串列 3、佇列 3.1、順序佇列 3.2、鏈式佇列 4、棧 4.1、順序棧

C++指標引用的區別與聯絡

1.指標和引用的定義和性質區別: (1)指標是一個變數,只不過這個變數儲存的是一個地址,指向記憶體的一個儲存單元;     而引用跟原來的變數實質上是同一個東西,只不過是原變數的一個別名而已。 (2)可以有const指標,常量指標可以改變指向,指標常量

C++總結1——指標引用/陣列的區別【轉】

1.指標和引有什麼區別?(從反彙編角度回答)  a.其實引用和指標本質上是一樣的,他們的彙編指令都是兩行。  int a = 10;  int *p = &a;  //lea eax,[a]                          將a的地址放在

unityC#試題記錄解答

C# Q:問類和結構區別 A: Q:介面和抽象函式異同 A: Q:問陣列和字典 很細 A: Q:問棧堆區別 A: Q:虛擬函式 建構函式 Q:ref out A: Q:什麼是GC Q:委託 算術 Q:排序有哪些 複雜程度? Q:

指標引用的理解(c++)

1.指標 typedef說明一種新型別名,來代替已有型別名。 a.案例:typedef char* String_t和#define String_d char *這兩句在使用上的區別? 1)前者宣告一個型別的別名,在編譯時處理,有型別檢查。後者是一個簡單的替換,在預編譯時處理,無型別檢查。 2)St

C++中指標引用的區別

下面用通俗易懂的話來概述一下: 指標-對於一個型別T,T*就是指向T的指標型別,也即一個T*型別的變數能夠儲存一個T物件的地址,而型別T是可以加一些限定詞的,如const、volatile等等。見下圖,所示指標的含義: 引用-引用是一個物件的別名,主要用於函式引

C++試題——const static

雖說不太喜歡這種問語言特性的題目,但是國內好多公司貌似就喜歡問這個,還覺得問這個很高階,就把他們常問的一些東西寫下來做個總結,有的東西還是有些意思的,有些東西其實都沒個固定的答案。不出意外將會寫一個系列包括: const和static的區別iterator和引用的實現以及

C++分別用指標引用實現交換函式

       前幾天上課老師給出了一個課堂作業:請分別用指標和引用來實現兩個數的交換。雖然題目比較俗套,但是好久沒寫過C++程式了,依然很生疏,所以我決定總結一下自己的實現,程式粗糙,風格也混合著C,希望大家給提提建議。        老師出這個題目的目的無非是想讓我們聯絡