指針是一個(gè)存儲(chǔ)計(jì)算機(jī)內(nèi)存地址的變量。從指針指向的內(nèi)存讀取數(shù)據(jù)稱作指針的取值维咸。指針可以指向某些具體類型的變量地址剂买,例如int、long和double癌蓖。指針也可以是void類型、NULL指針和未初始化指針租副。
根據(jù)出現(xiàn)的位置不同,操作符?*?既可以用來聲明一個(gè)指針變量结胀,也可以用作指針的取值责循。當(dāng)用在聲明一個(gè)變量時(shí),*表示這里聲明了一個(gè)指針院仿。其它情況用到*表示指針的取值。
&是地址操作符剥汤,用來引用一個(gè)內(nèi)存地址排惨。通過在變量名字前使用&操作符,我們可以得到該變量的內(nèi)存地址省有。
// 聲明一個(gè)int指針
int*ptr;
// 聲明一個(gè)int值
int? val = 1;
// 為指針分配一個(gè)int值的引用
ptr = &val;
// 對(duì)指針進(jìn)行取值,打印存儲(chǔ)在指針地址中的內(nèi)容
int deref = *ptr;
printf("%d\n", deref);
第2行蠢沿,我們通過*操作符聲明了一個(gè)int指針。接著我們聲明了一個(gè)int變量并賦值為1恤磷。然后我們用int變量的地址初始化我們的int指針野宜。接下來對(duì)int指針取值,用變量的內(nèi)存地址初始化int指針匈子。最終河胎,我們打印輸出變量值,內(nèi)容為1虎敦。
第6行的&val是一個(gè)引用。在val變量聲明并初始化內(nèi)存之后其徙,通過在變量名之前使用地址操作符&我們可以直接引用變量的內(nèi)存地址。
第8行访锻,我們?cè)僖淮问褂?操作符來對(duì)該指針取值闹获,可直接獲得指針指向的內(nèi)存地址中的數(shù)據(jù)。由于指針聲明的類型是int昌罩,所以取到的值是指針指向的內(nèi)存地址存儲(chǔ)的int值。
說穿了遣总,指針就是地址吧轨功,這里可以把指針、引用和值的關(guān)系類比為信封古涧、郵箱地址和房子。一個(gè)指針就好像是一個(gè)信封菇爪,我們可以在上面填寫郵寄地址。一個(gè)引用(地址)就像是一個(gè)郵件地址熙揍,它是實(shí)際的地址届囚。取值就像是地址對(duì)應(yīng)的房子。我們可以把信封上的地址擦掉意系,寫上另外一個(gè)我們想要的地址饺汹,但這個(gè)行為對(duì)房子沒有任何影響。