C 指標和引用

2021-08-21 05:35:16 字數 2863 閱讀 2977

指標和引用性質的區別

int a=1;int

*p=&a;

int a=1;int &b=a;

2)可以有const 指標,沒有const引用;

3)指標可以有多級,但是引用只能是一級;(int **p是合法的,但是int&& a 是不合法的;)

4)指標的值可以為空,但是引用的值不能為null;並且引用在使用的時候必須進行初始化;

5)指標的值在初始化之後是可以進行改變的,但是引用的值在初始化之後就不能進行改變了,而且是從一而終的。

6)sizeof引用指向的是指向變數(物件的大小),而sizeof指標指向的是指標本身的大小;

7)指標和引用的自增(++)意義不一樣;

8)相對而言指標比引用更安全(指標會出現野指標的問題)

指標和引用的相同點

指標和引用都是位址上面的概念

指標指向是一段記憶體空間,它的內容是所指記憶體的位址

引用是一段記憶體的別名

引用定義格式

型別 &引用變數名=已定義過的變數名

引用的特點

const

int* p;//const修飾*p,指向的內容不可以改變

intconst* p;//const修飾的是*p,指向的內容不能夠改變

int* const p;//指向內容可以被改變,指標本身可以改變

const

int* const p;//指向的內容和指標本身都不改變

int a = 1;

int* p1 = &a;

const

int* p2 = p1;

//許可權被縮小了,所以可以正確

const

int* p1 = &a;

int* p2 = p1;

//不可以,因為const修飾的是*p1,所以*p1是不可以改變的

//而p2是int*的,所以是可讀可寫的,p1賦給p2

//許可權被放大。const* 不可以轉換成為int*;

intconst *p1 = &a;

int* p2 = p1;

//p1是可讀的,賦值給p2變成了唯讀只寫的,許可權被放大,所以不通過

int* const p3 = &a;

int* p4 = p3;

//等價於const int a;

// int b=a;

//b的改變不會影響到a,同樣的p4的改變不會影響*p3的值。

int* p1 = &a;

int* const p2 = p1;

//正確,因為const修飾p2,p2不能改變,將p1賦給p2是可以的

int* p3 = &a;

intconst *p4 = p3;

//正確,p3是可讀可寫的當我們賦給p4是可讀的,許可權被縮小也是可以的

const

int a = 10;

int& b = a;

//a是常量,不能給常量賦值

const

int a = 10;

const

int&b = a;

//正確,常量具有常性,只有常引用可以引用常量

double a = 1.1;

int& b = a;

//a是double型別的,b是int型別的,a賦值給b實際上要生成乙個

//臨時變數,b實際上引用的是這個帶有常屬性的臨時變數,所以

//不能賦值。

const

int& c = a;//正確,常引用可以引用常量

許可權可以被縮小,但是不能被放大,這裡針對的是引用

/如果形參是非引用的傳值方式,則生成區域性臨時變數接收實參的值

//值傳遞,不能實現交換,因為傳參時,對於引數a和引數b只是

//拷貝的乙個臨時副本,交換的是副本值,因為其是臨時變數函式

//退出,變數銷毀,並不會影響外部a和b的值;

void swap(int a, int b)//值傳遞,不能實現交換,

//如果形參是引用型別,則形參只是實參的別名

//使用引用的話不會做臨時的拷貝,&的使用說明的

//此處只是原引數的另乙個名字而已,所以修改時

//直接在原引數的基礎上修改變數值

void swap(int& a, int& b)//引用傳遞

//傳入的是位址,因為位址是唯一的,所以指標通過位址的訪問

//進而可修改裡面的內容

void swap(int* pa, int* pb)//指標傳遞

如果返回物件出了當前函式作用域還在,使用引用(效率高);

如果返回物件出了當前函式作用域不存在,就使用傳值返回;

牛刀小試—–看下面

#include 

using

namespace

std;

void swap(int& x, int& y)

void test()

int main()

執行結果,出現了致命性的錯誤!!!

C 指標和引用

在深入介紹之前我們首先來看一下指標和引用的定義 指標和引用的區別,然後分別針對指標和引用展開討論,深入細節為何有這些差異。指標和引用的定義,下面用通俗易懂的話來概述一下 而宣告指標是可以不指向任何物件,也正是因為這個原因,使用指標之前必須做判空操作,而引用就不必。其次,引用不可以改變指向,對乙個物件...

C 引用和指標

引用和指標看上去差不多,看上去差不多,其實男寶寶和女寶寶是不一樣的 用起來還是有一定差距。本人菜鳥僅將遇到的問題記錄備案,以便日後翻查 ptrfunc.h ifndef ptrfunc h define ptrfunc h typedef int func int,int struct aa end...

C 指標和引用

有了變數名,為什麼還需要乙個別名呢?c 之所以增加引用型別,主要是把它作為函式引數,以擴充函式傳遞資料的功能 到目前為止我們介紹過函式引數傳遞的兩種情況 1 將變數名作為實參和形參 這時傳給形參的是變數的值,傳遞是單向的 如果在執行函式期間形參的值發生變化,並不傳回給實參 因為在呼叫函式時,形參和實...