指標變數用於儲存資料的位址,使用方法如
int i=0;
int *p;
p=&i;//
此時,p
的值為i
的位址,
*p為位址所儲存的數值也就是
i的值,
i的值為位址所存放的值也就是
*p的值,
&i的值為
i*p==i
;p==&i
;引用為c++才有的功能,引用變數不占用記憶體,可理解為函式的別名,使用方法如
int i=0;
int &p=i;//
引用定義時必須繫結乙個變數,此時
p==i
,&p==&i
;引用變數可作為實參傳入函式(函式需宣告傳入的變數為引用型別)
指標變數(type *)與引用變數(type &)均可作為實參轉入函式,對位址內的資料進行修改。個人認為,每個變數均具有位址與數值兩種屬性,函式傳入變數中如果要求傳入型別數值,則單傳入數值,函式會另開闢記憶體來對傳入數值進行處理,函式內均為區域性變數;若傳入的引數中帶有資料的位址,則到相應位址訪問獲取數值並進行處理,引用變數具備了原變數的位址與數值的屬性,故可作為實參傳入函式
使用引用作為函式引數,函式就不用另外開闢記憶體來儲存傳入的數值,一定程度上節約了記憶體的占用,如果不想傳入的變數實際值被修改,可加
const(
可讀不可寫)修飾
int switch(int a,int b){
intt;
t=a;
a=b;
b=t;
int switch_2(int &a,int &b){
intt;
t=a;
a=b;
b=t;
int main(){
intx=0;
inty=1;
switch(x,y); //
這裡的x
傳到函式的時候,函式應該是先執行
int a=x
,int b=y
;故處理的實際為a與
b的值而非x與
y,所以傳入變數僅作為形參;
switch_2(x,y);
//這裡函式先執行的是
int&a=x,int &b=y
;然後對引用變數a與
b進行處理,因a與
b具有x,y的位址與數值屬性,所以實際處理的是x與
y的值。
陣列的引用為陣列的別名,使用方法如下:
int num[20];
int (&p)[20]=num;//
引用型別後面中括號為引用陣列的大小,若不一致則出錯,右值為陣列名,亦為陣列的首位址,這裡理解為陣列名會好點;可用在函式裡,使函式傳入固定大小的陣列;
陣列名可作為陣列的首位址使用,一般可以理解為是靜態指標int * const p(位址不可改),但陣列名並不等同於靜態指標,如
int a[10];
int *p;
p=a;
p==a;
sizeof(a);//
此處的返回這為
4*10
個位元組(
int型別
4位元組),也就是陣列的大小
sizeof(p);//
此處的返回值為4,
int類指標的大小;
int const *p中const修飾的為*p,故*p的值可讀不可寫,也就是指標所指的值,但是可以重新給指標賦值
int * const p中const修飾的為p,故p值可讀不可寫(初始化之後),也就是指標所指向的值可以修改,但是不可以給指標賦值(該指標只能指向初始化時的位址)
參考內容:
reinterpret_cast的用法
reinterspret_cast(*p)
例:unsigned int i= 1633837924;
unsigned int *p=&i;
unsigned char *p2;
//p2=p;這樣會出錯,因為型別不同
p2=reinterpret_cast(p);//
這裡p2
會獲取p
的位址,並轉為
char*
類,但因為
int類指標指向的是
4個位元組的資料,而
char
指標指向的是乙個位元組的資料,所以這裡會存在乙個轉換,
p2會把
p所指向的位址資料拆分為
4份,每份
1個位元組,然後把每個位元組的二進位制數轉為相應
ascii
碼表裡的字元,並將這些字元組合為乙個字串。比方說這裡的
p指向的i值為
1633837924
,轉為二進位制後為
0110 0001 0110 0010 0110 0011 01100100,
每乙個位元組轉為
10進製則是
97 、98、
99、100,對應
ascii
碼表則是
abcd
,相當於
p2=「
abcd」;
cout由上乙個分析可以得出,此處應列印「
abcd
」以及一堆亂碼(沒有
\0結束符)
,然而列印出的卻是「
dcba
」以及一堆亂碼,如果只是
abc,也就是
0110 0001 0110 0010 0110 0011
的話,則會列印「
cba」並不會出現亂碼
(首位補0,
\0的ascii碼為0
),所以實際應為
p2=「
dcba
」;(因為沒時間考究,個人猜測
int型別的儲存方式為
0110 0011 0110 0010 0110 0001 00000000
,而非00000000 0110 0001 0110 0010 0110
)const_cast
的用法const_cast(*p)
主要是用於把
const
指標轉普通以及普通轉
const
例:int i=1
;int *p
;int *const p=&i;
//注意
const
位置,p
所指向的值可讀不可寫,即
*p=4
不可行int *p2=
const_cast(p);//
此時p2
所指的值可讀寫,
*p2=4
可行參考**:
我理解的指標與引用
最近在學習golang的過程中,發現乙個有意思的事情,有的文章說函式呼叫傳參時slice是引用傳遞,有的說是值傳遞。為什麼同乙個東西大家會不同認識?為了搞清楚其本質,我進行了以下內容的研究 變數的變數名 變數值 變數位址在記憶體中是怎麼樣的?指標的定義是什麼?引用的定義是什麼?二者有什麼關係?函式傳...
C 指標的引用理解
指標可以作為引數傳遞直接修改所指的變數的值,如下 void change int p int main 指標傳遞實際上也是值傳遞,傳遞的值便是指標的位址,執行 p 20後,雖然傳遞的是乙個位址的副本,但是副本的值就是變數的位址,執行後,所指向的位址的值變成了20,達到了修改變數值的目的。所以,當需要...
指標與指標的引用
c 之研究 指標和引用 vb中的函式或過程的引數有2種傳遞方式 一種是值傳遞 一種是引用傳遞。分別用keywordbyval和keywordbyref指出。假設引數是以引用傳遞的話,函式或過程內部就能夠靠這個引用引數來改變外部變數的值。在c語言中,假設要實如今函式內部改變外部變數的值的話,就應該傳遞...