指標和引用性質的區別
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 將變數名作為實參和形參 這時傳給形參的是變數的值,傳遞是單向的 如果在執行函式期間形參的值發生變化,並不傳回給實參 因為在呼叫函式時,形參和實...