我想要一种语言,只需对它说我要干什么就行
C語(yǔ)言是20 世紀(jì)70 年代初期在貝爾實(shí)驗(yàn)室開(kāi)發(fā)出來(lái)的一種廣為使用的編程語(yǔ)言。指針是 C 語(yǔ)言最重要,也是最常被誤解的特性之一。讓我們一起了解一下指針的基礎(chǔ)知識(shí)吧。
>>>>
1.指針變量
理解指針的第一步是在機(jī)器級(jí)上觀察指針表示的內(nèi)容。大多數(shù)現(xiàn)代計(jì)算機(jī)將內(nèi)存分割為字節(jié)(byte),每個(gè)字節(jié)可以存儲(chǔ)8位的信息。
每個(gè)字節(jié)都有唯一的地址(address),用來(lái)和內(nèi)存中的其他字節(jié)相區(qū)別。如果內(nèi)存中有n個(gè) 字節(jié),那么可以把地址看作0~n-1的數(shù)。
? 地址???內(nèi)容
可執(zhí)行程序由代碼(原始C程序中與語(yǔ)句對(duì)應(yīng)的機(jī)器指令)和數(shù)據(jù)(原始程序中的變量)兩部分構(gòu)成。程序中的每個(gè)變量占有一個(gè)或多個(gè)字節(jié)內(nèi)存,把第一個(gè)字節(jié)的地址稱為變量的地址。下圖中,變量i占有地址為2000和2001的兩個(gè)字節(jié),所以變量i的地址是2000:
這就是指針的出處。雖然用數(shù)表示地址,但是地址的取值范圍可能不同于整數(shù)的范圍,所以一定不能用普通整型變量存儲(chǔ)地址。但是,可以用特殊的指針變量(pointervariable)存儲(chǔ)地址。在用指針變量p存儲(chǔ)變量i的地址時(shí),我們說(shuō)p“指向”i。Q&A換句話說(shuō),指針就是地址,而指針變量就是存儲(chǔ)地址的變量。
這里不再把地址顯示為數(shù),而是采用更加簡(jiǎn)單的標(biāo)記。為了說(shuō)明指針變量p存儲(chǔ)變量i的地址,把p的內(nèi)容顯示為指向i的箭頭:
指針變量的聲明
對(duì)指針變量的聲明與對(duì)普通變量的聲明基本一樣,唯一的不同就是必須在指針變量名字前放置星號(hào):
int*p;
上述聲明說(shuō)明p是指向int類型對(duì)象的指針變量。這里我們用術(shù)語(yǔ)對(duì)象來(lái)代替變量,是因?yàn)閜可以指向不屬于變量的內(nèi)存區(qū)域。
指針變量可以和其他變量一起出現(xiàn)在聲明中:
inti,j,a[10],b[20],*p,*q;
在這個(gè)例子中,i和j都是普通整型變量,a和b是整型數(shù)組,而p和q是指向整型對(duì)象的指針。
C語(yǔ)言要求每個(gè)指針變量只能指向一種特定類型(引用類型)的對(duì)象:
int*p;/*pointsonlytointegers*/double*q;/*pointsonlytodoubles*/char*r; ?/*pointsonlytocharacters*/
至于引用類型是什么類型則沒(méi)有限制。事實(shí)上,指針變量甚至可以指向另一個(gè)指針,即指向指針的指針。
?
?
2.取地址運(yùn)算符和間接尋址運(yùn)算符
為使用指針,C語(yǔ)言提供了一對(duì)特殊設(shè)計(jì)的運(yùn)算符。為了找到變量的地址,可以使用&(取地址)運(yùn)算符。如果x是變量,那么&x就是x在內(nèi)存中的地址。為了獲得對(duì)指針?biāo)赶驅(qū)ο蟮脑L問(wèn),可以使用*(間接尋址)運(yùn)算符。如果p是指針,那么*p表示p當(dāng)前指向的對(duì)象。
?
取地址運(yùn)算符
聲明指針變量是為指針留出空間,但是并沒(méi)有把它指向?qū)ο?#xff1a;
int*p;??? /*pointsnowhereinparticular*/
在使用前初始化p是至關(guān)重要的。一種初始化指針變量的方法是使用&運(yùn)算符把某個(gè)變量的地址賦給它,或者更常采用左值:
inti,*p;
...
p=&i;
通過(guò)把i的地址賦值給變量p的方法,上述語(yǔ)句把p指向了i:
?
?????????? ? ? ? ? ? ? ? ? ? ? ? ?
Q&A:在聲明指針變量的同時(shí)對(duì)它進(jìn)行初始化是可行的:
inti;
int*p=&i;
甚至可以把i的聲明和p的聲明合并,但是需要首先聲明i:
inti,*p=&i;
間接尋址運(yùn)算符
一旦指針變量指向了對(duì)象,就可以使用*運(yùn)算符訪問(wèn)存儲(chǔ)在對(duì)象中的內(nèi)容。例如,如果p
指向i,那么可以顯示出i的值,如下所示:
printf("%d\n",*p);
Q&A printf函數(shù)將顯示i的值,而不是i的地址。習(xí)慣于數(shù)學(xué)思維的讀者可能希望把*想象成&的逆運(yùn)算。對(duì)變量使用&運(yùn)算符產(chǎn)生指向變量
的指針,而對(duì)指針使用*運(yùn)算符則可以返回到原始變量:
j=*&i;???? /*sameasj=i;*/
只要p指向i,*p就是i的別名。*p不僅擁有和i相同的值,而且對(duì)*p的改變也會(huì)改變i的值。(*p是左值,所以對(duì)它賦值是合法的。)下面的例子說(shuō)明了*p和i的等價(jià)關(guān)系,這些圖 顯示了在計(jì)算中不同的點(diǎn)上p和i的值。
p=&i;
?
i=1;
printf("%d\n",i); ->? /*prints1*
/printf("%d\n",*p); -> ?/*prints1*/
*p=2;
?
?
printf("%d\n",i);?->?/*prints2*
/printf("%d\n",*p);??->??/*prints2*/
?
注意
不要把間接尋址運(yùn)算符用于未初始化的指針變量。如果指針變量p沒(méi)有初始化,那么試圖
使用p的值會(huì)導(dǎo)致未定義的行為:
int*p;
printf("%d",*p);/***WRONG***/?
給*p賦值尤其危險(xiǎn)。如果p恰好具有有效的內(nèi)存地址,下面的賦值會(huì)試圖修改存儲(chǔ)在該地址的數(shù)據(jù):
int*p;
*p=1;/***WRONG***/?
如果上述賦值改變的內(nèi)存單元屬于該程序,那么可能會(huì)導(dǎo)致出乎意料的行為;如果改變的內(nèi)存單元屬于操作系統(tǒng),那么很可能會(huì)導(dǎo)致系統(tǒng)崩潰。編譯器可能會(huì)給出警 告消息,告知p未初始化,所以請(qǐng)留意收到的警告消息。
?
3.指針賦值
C語(yǔ)言允許使用賦值運(yùn)算符進(jìn)行指針的復(fù)制,前提是兩個(gè)指針具有相同的類型。假設(shè)i、j、 p和q聲明如下:
inti,j,*p,*q;?
語(yǔ)句?
p=&i;
是指針賦值的示例,把i的地址復(fù)制給p。下面是另一個(gè)指針賦值的示例:?
q=p;?
這條語(yǔ)句是把p的內(nèi)容(即i的地址)復(fù)制給q,效果是把q指向了p所指向的地方:
?
?
現(xiàn)在p和q都指向了i,所以可以用對(duì)*p或*q賦新值的方法來(lái)改變i:
*p=1;
?
*q=2;
?
?
任意數(shù)量的指針變量都可以指向同一個(gè)對(duì)象。注意不要把
q=p;
和
*q=*p;
搞混。第一條語(yǔ)句是指針賦值,而第二條語(yǔ)句不是。就如下面的例子顯示的:
p=&i;q=&j;i=1;
*q=*p;
賦值語(yǔ)句*q=*p;是把p指向的值(i的值)復(fù)制到q指向的對(duì)象(變量j)中。
?
推薦閱讀
《C語(yǔ)言程序設(shè)計(jì):現(xiàn)代方法(第2版?修訂版)》
本書(shū)特色
?近30年來(lái)珍寶級(jí)C語(yǔ)言入門經(jīng)典,累計(jì)印數(shù)10萬(wàn)+,豆瓣評(píng)分9.3分
?? 哈佛、麻省理工、斯坦福等諸多名校C語(yǔ)言教材?
?? 基于C1X標(biāo)準(zhǔn)全新升級(jí)
內(nèi)容簡(jiǎn)介:
時(shí)至今日,C語(yǔ)言仍然是計(jì)算機(jī)領(lǐng)域的通用語(yǔ)言之一,但今天的C語(yǔ)言已經(jīng)和最初的時(shí)候大不相同了。本書(shū)主要目的就是通過(guò)一種“現(xiàn)代方法”來(lái)介紹C語(yǔ)言,書(shū)中強(qiáng)調(diào)標(biāo)準(zhǔn)C,強(qiáng)調(diào)軟件工程,不再?gòu)?qiáng)調(diào)“手工優(yōu)化”。第2版修訂版中不僅有C99中的新特性,還與時(shí)俱進(jìn)地增加了C11和C18中的內(nèi)容。本書(shū)分為C語(yǔ)言的基礎(chǔ)特性、C語(yǔ)言的高級(jí)特性、C語(yǔ)言標(biāo)準(zhǔn)庫(kù)和參考資料4個(gè)部分。每章末尾的“問(wèn)與答”部分給出一系列與該章內(nèi)容相關(guān)的問(wèn)題及答案,此外還包含適量的習(xí)題。
***粉絲福利時(shí)間***
評(píng)論區(qū)留言,點(diǎn)贊數(shù)超過(guò)60即可
按照留言質(zhì)量選擇前六可獲得此書(shū)!!!
以48個(gè)小時(shí)計(jì)!
注:若是在活動(dòng)截止日期后24小時(shí)內(nèi)無(wú)法取得用戶回復(fù)或聯(lián)系,將按照留言點(diǎn)贊排名順延
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的我想要一种语言,只需对它说我要干什么就行的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。