文章目錄
- 1.變量的組成
- 2.指針
- 2.1 定義
- 2.2 使用指針操作變量
- 2.3 為什么使用指針
- 3.引用
- 3.1 定義
- 3.2 引用注意事項
- 4.引用和指針的區別
1.變量的組成
變量的組成:變量地址,變量名,變量值
例:
int i = 12;
2.指針
2.1 定義
指針用于存放一個變量在內存中的地址,通過指針間接操作這個變量。指針變量本身也是一個變量,也有變量地址,變量名,變量值。
例:
int i = 12;
int *p; //聲明一個整型指針變量p
p = &i; //將i的地址賦給指針變量p
&為取地址符。
int *p = &i;
等價于
int *p; //聲明一個整型指針變量p
p = &i; //將i的地址賦給指針變量p
指針變量p的變量值存放變量i的地址。
*p指向變量i的值
2.2 使用指針操作變量
通過 *p改變變量i的變量值
int i= 12;
int *p = &i; //聲明一個整型指針變量p
*p=13;
cout << i << endl;//輸出i=13
2.3 為什么使用指針
可以通過變量名i直接改變變量值,為什么通過指針呢?
其實通過變量名改變變量值,中間也是通過地址去訪問的。
從運行棧的角度考慮
int *ip; /* 一個整型的指針 */
double *dp; /* 一個 double 型的指針 */
float *fp; /* 一個浮點型的指針 */
char *ch; /* 一個字符型的指針 */
指針變量ip,dp,fp,ch的內存空間一般都是四字節,所有指針的值的實際數據類型,都是一個代表內存地址的長的十六進制數。
在棧上運行指針,比運行實際的變量所占的內存小, 把指針放到棧中能有效節省空間還能節省傳遞大參數時所耗費的時間 ,所以能更快, 而且棧空間很小很寶貴 , 不可能把大數據壓進去的。
3.引用
3.1 定義
- 引用是某個變量的別名,相當于某個變量的第二個名字。對引用的操作,就相當于對變量的操作
引用形式- 引用是用&引導定義:類型 &引用名=變量名;
int i = 12;
int &j = i;
cout<<"i="<<i<<" "<<"j="<<j<<endl;
//輸出i=12 j=12j = 13;
cout<<"i="<<i<<" "<<"j="<<j<<endl;
//輸出i=13 j=13cout<<"i的地址是:"<<&i<<endl;
//i的地址是:0x0001cout<<"j的地址是:"<<&j<<endl;
//j的地址是:0x0001
3.2 引用注意事項
- 不能建立引用的引用
- 不能建立引用數組,不能建立數組引用
- 可以建立指針的引用,不能建立指向引用的指針
int i=0,a[10];
int &&ii=i; //錯誤,ii是引用的引用
int &&aa=a; //錯誤,aa是數組的引用
int &*ip=i; //錯誤,ip是指向引用的指針int *pi=&i;
int *&pr=pi; //正確,pr是指針的引用
4.引用和指針的區別
相同點:
- 都是地址的概念;
- 指針指向一塊內存,它的內容是所指內存的地址;
- 引用是某塊內存的別名。
區別:
- 指針是一個變量,只不過這個變量存儲的是一個地址,指向內存的一個存儲單元,即指針是一個實體;而引用跟原來的變量實質上是同一個東西,只不過是原變量的一個別名而已。
- 指針的值可以為空,但是引用的值不能為NULL,并且引用在定義的時候必須初始化;
- 指針的值在初始化后可以改變,即指向其它的存儲單元,而引用在進行初始化后就不會再改變了,從一而終。
- ”sizeof引用”得到的是所指向的變量(對象)的大小,而”sizeof指針”得到的是指針本身的大小;
- 指針和引用的自增(++)運算意義不一樣;
- 引用沒有 const,指針有 const,const 的指針不可變;
- 引用使用時無需解引用(*),指針需要解引用;
參考:
[1]http://t.csdnimg.cn/S3Fu1
[2]https://blog.csdn.net/shang_0122/article/details/104755481
[3]https://blog.csdn.net/tonglin12138/article/details/94555024