指標是乙個變數,只不過這個變數儲存的是乙個位址,指向記憶體的乙個儲存單元;而引用僅是個別名;
引用使用時無需解引用(*),指標需要解引用;
引用只能在定義時被初始化一次,之後不可變;指標可變;
//指標
int a =1;
int c =2;
int*b =
&a;cout<<
*b
cout<<
*b
cout<<
*b
cout<<
*b<結果:1
//a = 1 , *b = 1 , c = 2
0//a = 0 , *b = 0 , c = 2
2//a = 0 , *b = 2 , c = 2
3//a = 0 , *b = 3 , c = 3
//引用
int a =1;
int c =2;
int&b = a;
cout
cout
cout
cout<結果:1
//a = 1 , b = 1 , c = 2
0//a = 0 , b = 0 , c = 2
2//a = 2 , b = 2 , c = 2
2//a = 2 , b = 2 , c = 3
引用沒有 const,指標有 const;
順帶提一下 const
char*,
char
const*,
char
*const 三者的區別
const
char
*p;// 宣告乙個指向字元或字串常量的指標(不可通過指標p去修改p指向的內容)
char
const
*p;// 等同於 chonst char *
char
*const p;
//宣告乙個指向字元或字串的指標常量,即不可以修改p的值,也就是位址無法修改。
//記憶方法:const 修飾p=>p的值不能變=>p的指向無法修改
引用不能為空,指標可以為空;
結合上述第三點,引用只會在定義時初始化一次,所以引用為空不合理
int*t =
null
;//nullptr
「sizeof 引用」得到的是所指向的變數(物件)的大小,而「sizeof 指標」得到的是指標本身的大小;
double a =1;
double
* b =
&a;double
& c = a;
cout<<
sizeof
(b)<<
" "<<
sizeof
(c)<結果:
48 指標大小為4,引用大小為8
指標和引用的自增(++)運算意義不一樣;
int a =1;
int b =2;
int* c =
&a;int
* d =
&b;int
& e = b;
cout<" "<" "<<
*d<<
" "
,e++
; cout<" "<<
*d<<
" "<結果:
0x68fed0
0x68fecc22
//a的位址,b的位址,*d(b)的值,c(b)的值
0x68fed013
//d++,指標++,d的值(即位址值,加上了該資料型別的長度(這裡為sizeof(int)=4)),跳躍到了a,也就是此時d指向了a。所以*d(a)=1。
//e++,引用++,相當於儲存的值++,所以此時b和e都為3
指標可以有多級,但是引用只能是一級(int **p;合法 而 int &&a是不合法的(注:當作右值引用當然是可以,但是如果像指標那樣去理解則是不對的))
int a =1;
int*aa=
&a;int
**aaa =
&aa;
cout<" "<" "
*aa<<
" "<<
**aaa<結果:
10x68fed8
0x68fed4
11
從記憶體分配上看:程式為指標變數分配記憶體區域,而引用不需要分配記憶體區域。 C 中 (指標引用)和 (指標)的區別
很久之前學的c 了,複習一下,指標是乙個存放位址的變數,而指標引用指的是這個變數的引用,眾所周知c 中如果引數不是引用的話會呼叫引數物件的拷貝建構函式,所以如果有需求想改變指標所指的物件 換句話說,就是要改變指標裡面存的位址 就要使用指標引用,在網上看到大佬的 簡單明瞭,如下 include usi...
C 中指標引用和指標的區別
指標 是位址 即記憶體單元的編號 指標變數 是乙個存放位址的變數 指標引用 指的是這個指標變數的引用 眾所周知c 中如果引數不是引用的話會呼叫引數物件的 拷貝建構函式 重新開闢一塊一模一樣的記憶體空間 所以如想改變指標變數裡面存的位址,就要使用指標引用 讀 前請先搞懂 二級指標 指標的指標 指向指標...
C 中指標和引用的區別
引用和指標 相同點 1.都是位址的概念 指標指向一塊記憶體,它的內容是所指記憶體的位址 引用是某塊記憶體的別名。區別 1.指標是乙個實體,而引用僅是個別名 2.引用使用時無需解引用 指標需要解引用 3.引用只能在定義時被初始化一次,之後不可變 指標可變 引用 從一而終 4.引用沒有 const,指標...