第1周:指針與字符串——1.1 指針的使用

1.指針的應(yīng)用場(chǎng)景

交換兩個(gè)變量的值(只能由指針完成)践盼;

函數(shù)返回多個(gè)值,某些值就只能通過(guò)指針?lè)祷?/b>(傳入的參數(shù)實(shí)際上是需要保存帶回的結(jié)果的變量)函數(shù)結(jié)果不止一個(gè)宾巍,通過(guò)指針把要接收的結(jié)果變量的地址傳進(jìn)去,函數(shù)把結(jié)果變量填好傳回值渔伯;

函數(shù)返回運(yùn)算的狀態(tài)顶霞,結(jié)果通過(guò)指針?lè)祷亍?/b>常用的套路是讓函數(shù)返回特殊的不屬于有效范圍的值來(lái)表示出錯(cuò)(-1或0,在文件操作會(huì)看到大量的例子)锣吼。但是當(dāng)任何數(shù)值都是有效的可能結(jié)果時(shí)选浑,就得分開(kāi)返回了。狀態(tài)用 return 玄叠,值用指針古徒。后續(xù)的語(yǔ)言(C++ ,Java)采用了異常機(jī)制來(lái)解決這個(gè)問(wèn)題读恃。


2.指針最常見(jiàn)的錯(cuò)誤

定義了指針變量隧膘,還沒(méi)有指向任何變量,就開(kāi)始使用指針寺惫。

所有本地變量都不會(huì)有默認(rèn)的初始值疹吃,若未賦值,本地變量里什么都沒(méi)有西雀。

任何一個(gè)地址變量萨驶,沒(méi)有被賦值之前,沒(méi)有得到任何變量的地址之前艇肴,不能通過(guò)*訪問(wèn)任何的變量和數(shù)據(jù)腔呜。


3.傳入函數(shù)的數(shù)組成了什么?

普通變量傳入函數(shù)再悼,接收到的是值核畴;指針傳入函數(shù),接收到的是指針的值帮哈,代表外面的變量膛檀。

為什么函數(shù)參數(shù)表里面的數(shù)組在函數(shù)里頭必須留一個(gè)空的方括號(hào)?為什么方括號(hào)里寫(xiě)數(shù)字也沒(méi)用?為什么函數(shù)里沒(méi)有辦法用 sizeof 得到正確的元素個(gè)數(shù)咖刃?

函數(shù)參數(shù)表中的數(shù)組實(shí)際上是指針泳炉,樣子看上去像一個(gè)數(shù)組,函數(shù)頭可以把它寫(xiě)成指針類型嚎杨,編譯通過(guò)花鹅,運(yùn)行正確。對(duì)于函數(shù)參數(shù)中的數(shù)組的 sizeof 枫浙,返回的是 int* 的 sizeof 而不是數(shù)組的刨肃。函數(shù)參數(shù)里的數(shù)組,與 main 中的數(shù)組地址相同箩帚,是同樣的地址代表同一個(gè)數(shù)組真友。

sizeof(a)==sizeof(int*)。但是可以用數(shù)組的運(yùn)算符 [ ] 進(jìn)行運(yùn)算紧帕。

以下4種函數(shù)原型是等價(jià)的:

int sum( int *ar盔然,int n );? ? int sum( int *是嗜,int ?)愈案;

int sum( int ar[ ],int n )鹅搪;? ? int sum( int [ ]站绪,int? );


4.數(shù)組變量是特殊的指針

數(shù)組變量本身表達(dá)地址丽柿。所以 int a[10]; int *p=a; 無(wú)需用&取地址恢准。

但是數(shù)組的單元表達(dá)的是變量,需要用&取地址航厚。a==&a[0];

[ ] 運(yùn)算符可以對(duì)數(shù)組做顷歌,也可以對(duì)指針做。p[0] 相當(dāng)于 a[0]幔睬。把 p (指針變量)所指的地方當(dāng)作是個(gè)數(shù)組眯漩,可認(rèn)為是長(zhǎng)度為1的數(shù)組。

* 運(yùn)算符可以對(duì)指針做麻顶,也可以對(duì)數(shù)組做赦抖。

數(shù)組變量是 const 指針,所以不能被賦值辅肾。數(shù)組變量間不能做互相賦值队萤。

int b[] ;相當(dāng)于 int* const b矫钓; ?b是常數(shù)要尔,不能被改變舍杜,不能代表別的數(shù)組,是一個(gè)常量指針赵辕。


5.指針與 const

指針可以是 const 既绩,指針指向的值可以是 const 。

指針是 const 表示一旦得到了某個(gè)變量的地址还惠,不能再指向其他變量(關(guān)系永久)饲握。

int *const q = &i; // q 是 const, q 的值不能被改變。

*q = 26;// OK ? ? q++;// ERROR

所指是 const 表示不能通過(guò)這個(gè)指針去修改那個(gè)變量(并不能使得那個(gè)變量成為 const)蚕键。

const int *p = &i; ? ?*p = 26;// ERROR! ( *p )是 const 救欧,不能通過(guò) p 做賦值。

i = 26; // OK i 可修改 ? ? p = &j ; ?// OK ?p 可修改

判斷哪個(gè)被 const 的標(biāo)志是 const 在 * 的前面還是后面锣光。

const 在 * 的前面表示所指是 const ,不能通過(guò)指針修改變量笆怠。

const 在 * 的后面表示指針是 const ,指針不能被修改。


6.轉(zhuǎn)換

總是可以把一個(gè)非 const 的值轉(zhuǎn)換成 const 的誊爹。

即使a不是const也能傳入函數(shù)中

void f ( const int* x) 骑疆,將 x 用指針的方式傳進(jìn)去,傳 const 指針替废。表示在函數(shù)內(nèi)部不改變指針?biāo)傅闹担荒芡ㄟ^(guò)指針修改變量泊柬。

當(dāng)要傳遞的參數(shù)的類型比地址大的時(shí)候椎镣,這是常用的手段:既能用比較少的字節(jié)數(shù)傳遞值給參數(shù),又能避免函數(shù)對(duì)外面的變量的修改兽赁。


7. const 數(shù)組

const int a[ ] = { 1,2,3,4,5,6 };

數(shù)組變量已經(jīng)是 const 的指針了状答,這里的 const 表明數(shù)組的每個(gè)單元都是 const int 。

所以必須通過(guò)初始化進(jìn)行賦值刀崖。


8.保護(hù)數(shù)組值

因?yàn)榘褦?shù)組傳入函數(shù)時(shí)惊科,傳入的是地址,所以那個(gè)函數(shù)內(nèi)部可以修改數(shù)組的值亮钦。

為了保護(hù)數(shù)組不被破壞馆截,可以設(shè)置參數(shù)為 const 。

int sum( const int a[ ] , int length );

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蜂莉,一起剝皮案震驚了整個(gè)濱河市蜡娶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌映穗,老刑警劉巖窖张,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蚁滋,居然都是意外死亡宿接,警方通過(guò)查閱死者的電腦和手機(jī)赘淮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)睦霎,“玉大人梢卸,你說(shuō)我怎么就攤上這事∷橛” “怎么了低剔?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)肮塞。 經(jīng)常有香客問(wèn)我襟齿,道長(zhǎng),這世上最難降的妖魔是什么枕赵? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任猜欺,我火速辦了婚禮,結(jié)果婚禮上拷窜,老公的妹妹穿的比我還像新娘开皿。我一直安慰自己,他們只是感情好篮昧,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布赋荆。 她就那樣靜靜地躺著,像睡著了一般懊昨。 火紅的嫁衣襯著肌膚如雪窄潭。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,741評(píng)論 1 289
  • 那天酵颁,我揣著相機(jī)與錄音嫉你,去河邊找鬼。 笑死躏惋,一個(gè)胖子當(dāng)著我的面吹牛幽污,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播簿姨,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼距误,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了款熬?” 一聲冷哼從身側(cè)響起深寥,我...
    開(kāi)封第一講書(shū)人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎贤牛,沒(méi)想到半個(gè)月后惋鹅,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡殉簸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年闰集,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了沽讹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡武鲁,死狀恐怖爽雄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情沐鼠,我是刑警寧澤挚瘟,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站饲梭,受9級(jí)特大地震影響乘盖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜憔涉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一订框、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧兜叨,春花似錦穿扳、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至跪但,卻和暖如春泽谨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背特漩。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留骨杂,地道東北人涂身。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像搓蚪,于是被迫代替她去往敵國(guó)和親蛤售。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容