指針
指針是一個變量,只不過這個變量存儲的是一個地址,指向內(nèi)存的一個存儲單元。
引用
引用跟原來的變量實質(zhì)上是同一個東西逾一,只不過是原變量的一個別名而已。(教科書標準)
指針與引用的區(qū)別
- 引用不可以為空肮雨,當被創(chuàng)建的時候遵堵,必須初始化,而指針可以是空值怨规,可以在任何時候被初始化
- 有const指針陌宿,但是沒有const引用
- 指針的值可以為空,但是引用的值不能為空波丰,并且引用在定義的時候必須初始化
- 指針的值在初始化后可以改變限番,即指向其它的存儲單元,而引用在進行初始化后就不會再改變
-
sizeof 引用
得到的是所指向的變量(對象)的大小呀舔,而sizeof pointer
”得到的是指針本身的大小弥虐,在64位機器下為8字節(jié) - 指針可以有多級扩灯,但是引用只能是一級
- 如果返回動態(tài)內(nèi)存分配的對象或者內(nèi)存,必須使用指針霜瘪,引用可能引起內(nèi)存泄漏
- 指針和引用的自增(++)運算意義不一樣
函數(shù)傳參
指針傳參數(shù)
演示代碼如下珠插,編譯g++ main.c -o main -std=c++11
:
#include <iostream>
#include "stdio.h"
using namespace std;
void swap(int *a, int *b) {
int *tmp = a;
a = b;
b = tmp;
}
void testp(int *p) {
int c = 5;
p = &c;
cout << p << " " << *p << endl;
}
int main(int argc, char** argv) {
int a = 1, b = 2;
swap(&a,&b);
cout << a << " " << b << endl;
int *p = nullptr;
testp(p);
if (p == nullptr)
cout << "p is nullptr" << endl;
else
cout << p << " " << *p << endl;
return 0;
}
編譯運行之后的結果:
可以觀察到的結果:
-
swap
函數(shù)沒有交換a,b
的值 - 在
testp
函數(shù)中指針p是地址颖对,*p
取到了變量c
的值 -
testp
函數(shù)沒有返回后沒有改變傳入的指針參數(shù)p
引用傳參數(shù)
#include <iostream>
#include "stdio.h"
using namespace std;
void testp(int &p) {
cout << &p << " " << p << endl;
p = 5;
cout << &p << " " << p << endl;
}
int main(int argc, char** argv) {
int p = 1;
cout << &p << " " << p << endl;
testp(p);
return 0;
}
可以看到結果:
- 變量P三次地址都沒有改變
- 變量P的值在函數(shù)
testp
中最后一次改變了
運行如下:
引用實質(zhì)
我們知道在C
語言中無法使用引用傳參數(shù)捻撑,引用傳參數(shù)是C++
的語法。那么C語言中如何實現(xiàn)類似的功能呢缤底?
#include "stdio.h"
void swap(int *const a, int *const b) {
int tmp = *a;
*a = *b;
*b = tmp;
}
int main(int argc, char** argv) {
int x=10,y=20;
swap(&x,&y);
printf("%d %d\n", x, y);
return 0;
}
如上代碼就是C語言中的實現(xiàn)顾患,同樣也能實現(xiàn)x,y
的值交換个唧,只不過函數(shù)傳的參數(shù)是int *const
類型江解。
實際上,在引用中int &b=a
這一句代碼可被編譯器看做int * const b=&a
徙歼,加上const的作用是表明指針b的自身的值(a的地址)不能改變犁河,而指向的值(a的值)可以改變。也就是說引用相當于指針魄梯,引用與指針在編譯時的方法一樣桨螺,指向的都是變量的內(nèi)存地址。但是也有一些不同點如下:
- 在定義方式中引用儲存的是值酿秸,而指針是一個變量的拷貝灭翔,存儲的是地址
- 引用只能對已經(jīng)存在的變量或?qū)ο髮崿F(xiàn)引用,而指針則不需要辣苏,可以定義為空
- 在函數(shù)的傳參中缠局,如果傳遞的是一個引用,意味著這個變量或?qū)ο笠呀?jīng)存在了考润;如果傳遞的是一個指針,則不能判斷這個指針是不是有效的读处,是不是空的糊治,因此在函數(shù)體 中大多數(shù)都得進行指針是否為空的判斷。但是雖然引用較為安全罚舱,但是利用指針來傳參效率較快
- 引用是直接訪問變量井辜,不用分配自己的內(nèi)存空間,而指針是間接訪問管闷,需要定義粥脚,需要有自己的內(nèi)存空間
所以實際開發(fā)中,使用哪種方式應該由開發(fā)者自己來定包个,按照開發(fā)的需求來定刷允。