1. 程式人生 > >C++的const、指標、引用總結

C++的const、指標、引用總結

const與指標型別

根據寫法區分

(1)不可以通過指標來改變指標所指向的變數

const int *p=NULL;
int const *p=NULL;
上面兩種寫法完全等價,舉個例子:

int x=3;
const int *p=&x;
p=&y;       //正確
*p=4;       //錯誤

程式碼表示的含義如下表:

變數名 儲存地址 儲存內容
x &x 3
p &p &x

要注意的是,在這種情況下只是不能通過指標來改變所指向的x變數,但是x變數本身是可以改變的。

不信可以嘗試以下程式碼:

    int x= 3;
    const int *p=&x;
    cout<<*p<<endl;
    x=4;
    cout<<x<<endl;
    cout<<*p<<endl;

輸出結果為:
3
4
4

(2)指標所指向的地址不可改變

int *const p=NULL;
舉個例子:

int x=3;
int *const p=&x;
p=&y;       //錯誤
*p=4;       //正確

程式碼表示的含義如下表(粗體表示不可改):

變數名 儲存地址 儲存內容
x &x 3
p &p &x

const與引用

先說引用
(1)引用不是一種(獨立的)資料型別,因此初始化引用時必須宣告引用的型別
(2)引用與其所代表的變數共享同一記憶體空間(類比人的別名)
(3)不能建立引用的陣列
例如:

char [c]`='hello';
char &rc[c]=c;      //錯誤

因為陣列名c只代表陣列首元素的地址,本身不是一個佔有儲存空間的變數。

再說const引用,

int x =3;
const int &y=x;
x=10
; y=20; //錯誤 ,用const限定後不能通過別名來改變內容

與const指標同理,它並不阻止改變引用所代表變數的值,在上述程式碼後加上:

x=6;        //合法

指標變數的引用

看*號前面的型別可知指標所指向的變數的資料型別
看&號前面的型別可知引用所代表的變數的資料型別

int i=5;
int *p=&i;      //定義指向整形變數的指標變數p,指向i
int * &a=p;     //a是(指向整形變數的)指標變數p的引用
cout<<i<<endl;
cout<<*p<<endl;
cout<<a<<endl;

程式碼表示的含義如下表:

變數名 儲存地址 儲存內容
i &i 5
p &p &i
a &a &i

輸出結果為:
5
5
5
上面的例子是代表指標變數的引用,注意和下面的程式碼區別開

int& *p=&a; //錯誤

上述程式碼企圖定義指向引用的指標變數(看*號前面的型別) ,但是這是錯誤的,因為引用不是一個獨立的資料型別。

也就是說,可以定義指標變數的引用,但不能定義指向引用的指標

相關推薦

C++中const指標引用總結

C++中函式的引數相比C語言中的函式引數要複雜的多,其中主要的原因是C++中引入了引用以及const限定符。這兩個物件的引入,使得C++中的函式引數變得異常的複雜多變,每一種型別都具有比較適合的使用範圍。 一,引用 引用是物件的別名,必須在初始化的過程中與一個具體的物件繫

C++的const指標引用總結

const與指標型別 根據寫法區分 (1)不可以通過指標來改變指標所指向的變數 const int *p=NULL; int const *p=NULL; 上面兩種寫法完全等價,舉個例子: int x=3; const int *p=&

C++中為什麼要用虛擬函式指標引用才能實現多型?

學過C++的都知道,要實現C++的多型性必須要用到虛擬函式,並且還要使用引用或者指標,以前學習的時候書本上也是這麼說, 但是書本上沒有說為什麼?   其實只要你認真思考過這個問題你會有三個疑問: 為什麼要用虛擬函式? 為什麼要用指標或者引用? 為什麼使用派生類和基類物件

C++ 虛擬函式 6-- 三種呼叫虛擬函式的方式比較->通過物件指標引用

#include <iostream> #include <string> using namespace std; /*--------------------------------- 13-9 三種呼叫虛擬函式的方式比較 --------

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

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

C語言的指標連結串列的原理和各類操作

一、指標 1、運用指標         什麼是指標?什麼是記憶體地址?什麼叫做指標的取值?指標是一個儲存計算機記憶體地址的變數。從指標指向的記憶體讀取資料稱作指標的取值。指標可以指向某些具體型別的變數地址,例如int、long和double。指標也可以

普通值指標引用作為函式引數時的理解

       很多時候,我們都會看到在教科書上寫著各種值傳遞,引用傳遞,一看一大堆,有時候看的還容易迷糊,什麼情況該怎麼傳總是區分不清,下邊我們用一小版塊並結合程式碼例項講解下。 一、值傳遞 // 普通值傳遞 void test(int num) {

Android JNI程式設計(六)——C語言函式指標Unition聯合體列舉Typedef別名結構體結構體指標

一:函式指標 1.函式指標顧名思義就是定義一個指標變數指向一個函式,和一級指標並沒有很大的區別我們看如下程式碼就很清楚的知道了 #include<stdio.h> #include<stdlib.h> //定義一個函式 in

C++ const修飾函式函式引數函式返回值

const修飾函式在類中將成員函式修飾為const表明在該函式體內,不能修改物件的資料成員而且不能呼叫非const函式。為什麼不能呼叫非const函式?因為非const函式可能修改資料成員,const成員函式是不能修改資料成員的,所以在const成員函式內只能呼叫const函

迭代器和指標指標引用

迭代器和指標的區別: 相同的點: 都可以進行整數操作進行加減運算,實現當前位置的移動;支援同類型的進行減法操作,得到兩個指標之間的距離。 不同點: 迭代器: 1、 迭代器不是指標是類模版,表現像指標。它模擬了一些指標的功能, 通過過載指標

C語言——常量指標指標常量以及指向常量的指標常量三者區別詳解

C語言——常量指標和指標常量的區別 常量指標、指標常量以及指向常量的指標常量概念簡要描述 常量指標:表示const修飾的為所申明的型別。 例如: //注意char const *p與const char *p效果相同。 void consttest(co

面試題4:陣列指標引用的聯絡區別

陣列和指標??? 從兩個方面來看,一是作為一個語言,陣列是必須要支援的一種陣列型別,原因很簡單,陣列是線性表的直接體現。而從編譯器設計者的角度來看,如果為陣列專門設計一套實現標準會非常繁雜(事實上,後來C++完成了這一任務,它就是標準庫中的vector容器)。這一對矛盾最後

jna對結構體指標引用拷貝引數傳遞的使用

雖然之前也用過jna,但是對於結構體的傳遞、指標引數數與返回值、引用引數與返回值、拷貝變數傳遞使用沒有總結。 先上生成DLL程式碼: //dllTest.h#ifndef DLLTEST_H #define DLLTEST_H struct myStruct { i

右值引用左值引用指標RVO優化

這是我第一次真正意義上發技術部落格,對C++很多特性我瞭解的並不深,直到今天我才敢評論總結出來。 上面四個名詞,相信很多初學者會疑惑(我也不例外),什麼時候做什麼事?最開始,我的程式碼這麼寫: int max(int a, int b){ return a>b?a:

C++11智慧指標引用

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

指標引用總結

指標 若現在指標不知道指向,可以使用NULL,例如int *b = NULL; char *a = NULL;,但是使用的時候若指標指向的是陣列或者字串等,需要提前宣告大小。若是int *,則不需要,直接將一個int型別的指標賦值給它即可。 c++中的*與&對於初學者來說,確

c++ 中的指標引用

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

圖靈班第二次課---陣列指標二分查詢

1.scanf("%i",&n) 從鍵盤輸入的值都是字元,%i的作用是將字元轉換為整型,並存在與記憶體中。 2.記憶體 記憶體以位元組為單位,連續排列。整型佔4個位元組。 在定義陣列的時候,如int a[5];記憶體會給5*sizeof(int)個空間,

柯南君:教你如何對待大型電商平臺的效能優化?之 一 (方法指標工具定位)

3)Web Capacity Analysis Tool (WCAT)  這是一種輕量級負載生成實用工具,不僅能夠重現對 Web 伺服器(或負載平衡伺服器場)的指令碼 HTTP 請求,同時還可以收集效能統計資料供日後分析之用。WCAT 是多執行緒應用程式,並且支援從單個源控制多個負載測試客戶端,因此您可以模

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

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