明德大學(xué)計(jì)算機(jī)樓三號(hào)機(jī)房,空氣里彌漫著消毒水、灰塵和機(jī)器散熱孔噴出的微焦氣味混合的獨(dú)特氣息。
慘白的日光燈管嗡嗡作響,投下冰冷的光線。
幾十臺(tái)統(tǒng)一型號(hào)的黑色臺(tái)式機(jī)整齊排列,屏幕閃爍著幽藍(lán)的啟動(dòng)界面。
空氣沉悶得如同凝固的膠水。
俞小舟坐在靠窗的位置,指尖冰涼,懸在鍵盤上方微微發(fā)顫。
屏幕上,一行行黑色的代碼如同冰冷的咒語,無情地排列著。
光標(biāo)停在那個(gè)讓她連續(xù)三個(gè)晚上輾轉(zhuǎn)反側(cè)、幾乎要嘔出血來的地方:struct Node *p = head; // 定義指針p指向鏈表頭節(jié)點(diǎn)指針。
又是該死的指針!
這玩意兒像幽靈一樣纏繞著她。
*p 是什么?p->next 又指向哪里?為什么head明明在那里,p卻像瞎了一樣找不到?
每次編譯,猩紅的報(bào)錯(cuò)信息如同地獄的請(qǐng)柬,一次次宣告她的失敗。
那些關(guān)于內(nèi)存地址、間接引用的抽象概念,在她腦子里攪成一鍋冰冷的漿糊。
她感覺自己像被困在一個(gè)由無數(shù)個(gè)“0x7fff5fbff8c0”這種天書般地址組成的迷宮里,找不到出口,連方向都徹底迷失了。
旁邊傳來程曉菲煩躁的抓頭發(fā)聲和低聲咒罵:“靠!這鏈表怎么跟麻花似的,繞來繞去把自己繞死了!”
她面前的屏幕上,一個(gè)模擬鏈表操作的簡易圖形界面里,代表節(jié)點(diǎn)的方塊正以一種極其詭異的姿勢互相纏繞、打結(jié),最后變成一團(tuán)亂麻,旁邊彈出一個(gè)大大的紅色警告:“Null Pointer Dereference!”(空指針解引用!)
俞小舟偷偷瞥了一眼斜前方的林修。
他依舊像一尊精密儀器,脊背挺直,側(cè)臉線條冷硬,十指在鍵盤上穩(wěn)定地敲擊,屏幕上幽藍(lán)的代碼瀑布般流暢滾動(dòng)。
指針?
對(duì)他來說,大概就像呼吸一樣自然。
她甚至能想象出他腦子里那幅清晰無比的“內(nèi)存地圖”,每一個(gè)變量、每一個(gè)結(jié)構(gòu)體都精確地標(biāo)注在坐標(biāo)上,指針就是那根精準(zhǔn)無比的導(dǎo)航箭頭。
絕望像冰冷的潮水,一點(diǎn)點(diǎn)漫過腳踝,向上蔓延。
就在這時(shí)——
機(jī)房的門被推開,帶進(jìn)一股走廊里微涼的空氣。
助教走了進(jìn)來,手里拿著一疊打印紙。
“同學(xué)們注意!”助教的聲音打破了機(jī)房的沉悶,“林修同學(xué),”他目光投向角落那個(gè)安靜的身影,“王教授臨時(shí)有事,讓你代他給大家講一下鏈表操作里指針使用的幾個(gè)關(guān)鍵點(diǎn),特別是避免野指針和內(nèi)存泄漏的問題。半小時(shí)后他過來檢查?!?/p>
林修敲擊鍵盤的手指停頓了半秒。
他緩緩抬起頭,鏡片后的目光平靜無波地掃過助教,又掃過機(jī)房幾十張或茫然、或期待、或依舊沉浸在代碼苦海中的臉。
沒有點(diǎn)頭,也沒有搖頭。
只是極其輕微地,幾乎不可察覺地,下頜線繃緊了一瞬。
助教似乎早已習(xí)慣了他的沉默,把打印紙放在講臺(tái)上:“資料在這里,你看著講?!闭f完便轉(zhuǎn)身離開了。
機(jī)房再次陷入一片死寂,只有風(fēng)扇的嗡鳴和鍵盤的敲擊聲。
所有人都下意識(shí)地看向林修。
他會(huì)怎么做?
照著資料念一遍?
還是干脆無視?
俞小舟的心提到了嗓子眼。
她既害怕聽到那些冰冷艱澀的理論,又隱隱期待這個(gè)“大神”能有什么神奇的辦法,點(diǎn)破這層讓她窒息的窗戶紙。
林修沉默了幾秒。
他緩緩摘下耳機(jī),放在桌上,發(fā)出輕微的咔噠聲。
然后,他關(guān)閉了自己屏幕上那個(gè)復(fù)雜的多線程調(diào)試界面。
他并沒有走向講臺(tái),也沒有去拿那疊資料。
他的雙手重新放回鍵盤上。
指尖在鍵盤上飛快地跳躍了幾下,動(dòng)作快得讓人眼花繚亂。
屏幕上瞬間彈出一個(gè)純黑的終端窗口,白色的光標(biāo)在左上角規(guī)律地閃爍。
他輸入了一行命令,按下回車。
嗡——
他面前那臺(tái)電腦的機(jī)箱風(fēng)扇似乎瞬間提高了轉(zhuǎn)速,發(fā)出更響亮的嗡鳴。
緊接著,讓所有人目瞪口呆的一幕出現(xiàn)了!
林修沒有操作自己的電腦,而是直接伸手,極其自然地、甚至帶著點(diǎn)不容置疑的意味,一把抓過了旁邊程曉菲放在桌上的鼠標(biāo)!
“誒?!”程曉菲嚇了一跳,下意識(shí)地想搶回來。
林修的手腕穩(wěn)如磐石,輕易避開了她的動(dòng)作。
他握著鼠標(biāo),光標(biāo)在程曉菲那臺(tái)屏幕上還顯示著“鏈表亂麻”的電腦上快速移動(dòng)、點(diǎn)擊!
噠!噠!噠!
清脆的鼠標(biāo)點(diǎn)擊聲在寂靜的機(jī)房里格外清晰。
只見程曉菲的屏幕上,那個(gè)簡陋的鏈表可視化程序被最小化。
林修飛快地打開了一個(gè)純文本編輯器!
一個(gè)空白的、閃爍著光標(biāo)的編輯窗口!
他沒有輸入任何代碼。
他的指尖在鍵盤上再次跳躍,輸入了另一行命令。
嗡!
程曉菲的電腦屏幕猛地一暗!
隨即,一個(gè)極其復(fù)古的、由簡單的ASCII字符構(gòu)成的界面跳了出來!
白色的背景上,一個(gè)由綠色“@”符號(hào)組成的方塊(代表蛇頭),后面跟著一連串綠色的“o”符號(hào)(代表蛇身),正在一片由空白和零星幾個(gè)紅色“*”(代表食物)組成的“地圖”上緩緩移動(dòng)!
是貪吃蛇!
最原始版本的字符界面貪吃蛇游戲!
機(jī)房里的空氣仿佛凝固了一瞬,隨即響起一片壓抑不住的、帶著困惑和好奇的竊竊私語。
“搞什么?貪吃蛇?”
“指針呢?不是講指針嗎?”
“林大神這是……要玩游戲?”
程曉菲也懵了,看著自己屏幕上那條緩慢蠕動(dòng)的綠色字符蛇,完全摸不著頭腦。
林修沒有理會(huì)任何聲音。他握著鼠標(biāo),開始操控那條字符蛇。
動(dòng)作不疾不徐,讓蛇在有限的“地圖”里游走,吃掉一個(gè)紅色的“*”食物。
吃掉食物的瞬間,蛇尾立刻增加了一個(gè)綠色的“o”!
“看?!绷中薜穆曇舻谝淮卧诠_場合響起,不高,卻清晰地穿透了低語聲,帶著一種冰冷的穿透力。
他指著屏幕上那個(gè)新增加的“o”字符,“新的節(jié)點(diǎn)。內(nèi)存里分配的空間?!?/p>
他移動(dòng)鼠標(biāo),讓蛇頭(綠色的“@”)轉(zhuǎn)向另一個(gè)方向。
蛇身(綠色的“o”們)依次跟隨,形成一條移動(dòng)的軌跡。
“蛇頭,”林修的手指指向那個(gè)“@”,“是頭指針。head?!彼闹讣庖葡蛏哳^后面緊跟著的第一個(gè)“o”,“這是第一個(gè)節(jié)點(diǎn)。head->next指向它。”
他的鼠標(biāo)操控著蛇頭靈活地避開“墻壁”(由“#”字符組成),同時(shí)讓蛇身緊緊跟隨。
“head移動(dòng),head->next指向的節(jié)點(diǎn)也跟著動(dòng)。因?yàn)樗鼈儽恢羔樻溤谝黄??!?/p>
接著,他讓蛇頭猛地撞向一個(gè)“#”字符墻壁!
屏幕上瞬間彈出一個(gè)提示:“Game Over! Snake collided!”(游戲結(jié)束!蛇撞墻了?。?/p>
“野指針?!绷中薜穆曇艉翢o波瀾,像在陳述一個(gè)客觀事實(shí),“head指向了不該指的地方。程序崩潰?!?/p>
他重新開始游戲。這次,他操控蛇吃掉食物,蛇身變長。然后,他讓蛇頭繞了一個(gè)大圈,蛇身也跟著繞,最后,蛇頭幾乎要碰到蛇身中部的一個(gè)“o”。
“看這里?!绷中奘髽?biāo)的光標(biāo)精準(zhǔn)地點(diǎn)在蛇頭即將碰到的那個(gè)“o”上,“如果head->next->next->...某個(gè)指針指錯(cuò)了,指回了自己身體里的某個(gè)節(jié)點(diǎn)。”他讓蛇頭真的輕輕“碰”了一下那個(gè)“o”。
瞬間!屏幕上那條長長的綠色字符蛇,從被碰到的那個(gè)“o”開始,后面所有的“o”都開始瘋狂地閃爍、扭曲!
然后整個(gè)蛇身像被無形的力量攪亂,變成一團(tuán)亂麻,最后程序再次崩潰!
“循環(huán)引用。指針指回了鏈表中某個(gè)已存在的節(jié)點(diǎn),形成環(huán)。死循環(huán)。內(nèi)存泄漏?!绷中薜穆曇粢琅f平靜,卻像重錘敲在每個(gè)人心上。
他指著屏幕上那團(tuán)崩潰的亂碼,“野指針和內(nèi)存泄漏的后果?!?/p>
機(jī)房徹底安靜了。剛才的竊竊私語消失了。
所有人都屏住了呼吸,目光死死盯著程曉菲屏幕上那個(gè)簡單的字符界面。
那條綠色的“@”和“o”,不再是游戲里的蛇,而是變成了活生生的、在內(nèi)存中游走的鏈表節(jié)點(diǎn)!
每一次移動(dòng),每一次碰撞,都清晰地演示著指針如何牽引、如何出錯(cuò)、如何導(dǎo)致災(zāi)難!
抽象的概念,冰冷的地址,瞬間被賦予了生命和軌跡!
俞小舟感覺自己的心臟在胸腔里狂跳!
她死死盯著屏幕,那條綠色的蛇仿佛游進(jìn)了她的腦子里!
head就是蛇頭,next就是連接身體的指針!
野指針就是撞墻!
循環(huán)引用就是蛇咬到自己!原來……原來指針的世界是這樣的!
它不再是冰冷的天書,而是一個(gè)有跡可循、有血有肉(雖然是字符的)的動(dòng)態(tài)世界!
林修重新開始游戲。這一次,他操控得更加流暢。
蛇在有限的空間里靈巧地游走,吃掉食物,增長身體,避開墻壁和自己。
他一邊操作,一邊用最簡潔的語言點(diǎn)出關(guān)鍵:
“malloc 是吃食物,分配新節(jié)點(diǎn)?!?/p>
“free 是蛇縮短,釋放節(jié)點(diǎn)空間。不及時(shí)釋放,蛇會(huì)撐死(內(nèi)存耗盡)?!?/p>
“p = p->next,指針移動(dòng),就像蛇頭帶著身體走。”
沒有復(fù)雜的術(shù)語,沒有深?yuàn)W的推導(dǎo)。
只有一條在字符地圖里游走的蛇,和它背后清晰映射的指針邏輯。
程曉菲也看呆了,忘了自己的鼠標(biāo)還在林修手里。
她喃喃自語:“靠……原來鏈表是條貪吃蛇啊……那我剛才那團(tuán)亂麻,就是蛇把自己勒死了?”
半小時(shí)后,王教授推門進(jìn)來時(shí),看到的就是這樣一幅景象:整個(gè)機(jī)房的學(xué)生,都圍在林修和程曉菲的座位后面,幾十雙眼睛緊緊盯著那臺(tái)顯示著字符貪吃蛇的電腦屏幕,眼神專注,甚至帶著一種豁然開朗的興奮光芒。
而林修,依舊沒什么表情,只是指尖操控著鼠標(biāo),讓那條綠色的字符蛇在“內(nèi)存”的疆域里,劃出一道道清晰而穩(wěn)固的軌跡。
……
明德大學(xué)東區(qū)操場,凜冽的寒風(fēng)如同無數(shù)把冰冷的小刀,刮過裸露的皮膚。
鉛灰色的天空低垂,仿佛隨時(shí)要壓下來。塑膠跑道在寒風(fēng)中顯得格外僵硬冰冷。
體育系突擊體能測試的通知像一道晴天霹靂,毫無預(yù)兆地砸在所有人頭上。
跑道旁,一群穿著單薄運(yùn)動(dòng)背心和短褲的體育生們正瑟瑟發(fā)抖地做著熱身,呼出的白氣瞬間被風(fēng)撕碎。
趙明陽也在其中,高大健碩的身軀在寒風(fēng)中像一座移動(dòng)的堡壘,但此刻這座堡壘正微微顫抖——一半是冷的,一半是慌的。
“臥槽!老李你聽說了嗎?”趙明陽一邊用力搓著凍得發(fā)紅的胳膊,一邊壓低聲音對(duì)旁邊一個(gè)同樣壯實(shí)的男生說,“下午高數(shù)隨堂測驗(yàn)!老陳頭搞突然襲擊!泰勒公式展開!那玩意兒長得跟老太太裹腳布似的!老子昨天訓(xùn)練完累成狗,回去倒頭就睡,一個(gè)字沒看??!”
被叫做老李的男生苦著臉:“誰不是呢!我連泰勒是男是女都不知道!這下完了,體測要是再不過,高數(shù)再掛……教練非把我皮扒了當(dāng)球踢!”
體測和高數(shù)的雙重絞索,勒得人喘不過氣。
跑道盡頭,單杠區(qū)域已經(jīng)排起了隊(duì)。引體向上是體測的必考項(xiàng)目,也是趙明陽這種力量型選手的強(qiáng)項(xiàng),但此刻他滿腦子都是“f(x) = f(a) + f'(a)(x-a) + ... ”這種魔咒般的攻勢,肌肉都僵硬了幾分。
“下一個(gè)!趙明陽!”體育老師渾厚的聲音穿透寒風(fēng)。
趙明陽深吸一口冰冷的空氣,仿佛要把肺都凍住。
他走到單杠下,原地跳了兩下,活動(dòng)了一下凍得有些發(fā)僵的肩膀。
雙手抓住冰冷的金屬杠,觸感刺骨。他深吸一口氣,雙臂猛然發(fā)力!
呼!
強(qiáng)壯的身體瞬間離開地面!動(dòng)作標(biāo)準(zhǔn)而充滿力量感!下巴輕松過杠!
一個(gè)!兩個(gè)!三個(gè)!
肌肉賁張,動(dòng)作流暢,展現(xiàn)出籃球運(yùn)動(dòng)員出色的上肢力量。
然而,就在他做到第五個(gè),身體再次向上牽引的瞬間——
“泰勒中值定理……是……是……”一個(gè)細(xì)若蚊蚋、帶著劇烈喘息和不確定的背誦聲,極其突兀地從他喉嚨里擠了出來!聲音斷斷續(xù)續(xù),被劇烈的呼吸切割得支離破碎!
旁邊等著測試的同學(xué)和體育老師都愣住了,目光齊刷刷聚焦過來。
趙明陽的臉?biāo)查g漲得通紅!像煮熟的蝦!他恨不得把舌頭咬掉!
腦子里那該死的公式像失控的彈幕一樣瘋狂刷屏!
身體還在機(jī)械地上下運(yùn)動(dòng),但心思已經(jīng)完全飛到了九霄云外!
第六個(gè)引體向上,動(dòng)作明顯變形,顯得有些吃力。他咬著牙,脖子上的青筋都暴了起來,嘴里還在無意識(shí)地、含混不清地咕噥:“……拉格朗日余項(xiàng)……Rn(x) = ……呃……是什么來著……”
體育老師皺著眉,看著這個(gè)平時(shí)引體向上輕松二十個(gè)不在話下的壯小伙,此刻才做了幾個(gè)就一臉便秘的表情,嘴里還念念有詞,忍不住提醒:“趙明陽!專心點(diǎn)!動(dòng)作做標(biāo)準(zhǔn)!”
趙明陽心里哀嚎:我也想專心??!可那該死的泰勒他陰魂不散??!
就在這時(shí)!
“喂!大陽!”一個(gè)熟悉又帶著點(diǎn)戲謔的聲音從操場邊緣傳來!
趙明陽正吊在單杠上,艱難地完成第七個(gè)(動(dòng)作已經(jīng)相當(dāng)勉強(qiáng)),聞聲下意識(shí)地扭頭望去——
只見404小隊(duì)的另外三人不知何時(shí)出現(xiàn)在了跑道邊!
程曉菲雙手叉腰,一臉看好戲的表情。俞小舟裹著厚厚的羽絨服,小臉凍得通紅,眼神里帶著擔(dān)憂。
而林修,依舊是那副萬年不變的冰山臉,雙手插在黑色羽絨服口袋里,目光平靜地看著這邊。
程曉菲沖著趙明陽咧嘴一笑,露出一口白牙,然后猛地從自己鼓鼓囊囊的背包里掏出一個(gè)東西!
一個(gè)老式的、黑色塑料外殼的便攜式錄音機(jī)!
上面還纏著一圈圈黑色的電線!
她動(dòng)作麻利地按下播放鍵,然后把錄音機(jī)用力往趙明陽的方向一拋!
錄音機(jī)在空中劃出一道拋物線!
“接著!”程曉菲大喊。
趙明陽幾乎是本能地,在完成第八個(gè)引體向上、身體下落的瞬間,伸出左手閃電般一撈!
啪!
穩(wěn)穩(wěn)接??!
入手冰涼沉重。他低頭一看,錄音機(jī)小小的液晶屏亮著,顯示著播放狀態(tài)。
一個(gè)清晰、平穩(wěn)、毫無感情起伏的男聲,正透過小小的揚(yáng)聲器孔傳出來,音量不大,卻異常清晰地鉆進(jìn)他的耳朵:
“……泰勒中值定理:如果函數(shù)f(x)在含有x0的開區(qū)間(a,b)內(nèi)具有直到(n+1)階的導(dǎo)數(shù),則當(dāng)x∈(a,b)時(shí),有:f(x) = f(x0) + f'(x0)(x-x0) + (f''(x0)/2!)(x-x0)^2 + ... + (f^{(n)}(x0)/n!)(x-x0)^n + Rn(x) ……”
是林修的聲音!是他錄的泰勒公式!
趙明陽的眼睛瞬間瞪得像銅鈴!一股難以言喻的暖流猛地沖上心頭,瞬間驅(qū)散了四肢百骸的寒意!
他幾乎是毫不猶豫地,手忙腳亂地把那圈纏繞在錄音機(jī)上的黑色電線扯開,然后極其粗暴地、像掛勛章一樣,把那個(gè)還在播放著冰冷公式的錄音機(jī),直接套在了自己的脖子上!
老舊的黑色錄音機(jī),帶著冰涼的塑料觸感,緊緊貼著他汗?jié)駶L燙的胸膛。
林修那毫無波瀾的、如同AI朗讀般的公式背誦聲,透過單薄的背心布料,清晰地、持續(xù)不斷地、如同魔音灌耳般直接傳入他的耳膜和胸腔!
“其中,Rn(x)是泰勒公式的余項(xiàng),常用的有余項(xiàng)形式有拉格朗日余項(xiàng):Rn(x) = [f^{(n+1)}(ξ) / (n+1)! ] * (x - x0)^{n+1},這里ξ是x0與x之間的某個(gè)值……”
體育老師和其他同學(xué)都看傻了!
這什么操作?
引體向上掛錄音機(jī)?
還放著數(shù)學(xué)公式?
趙明陽卻仿佛瞬間被打通了任督二脈!
他重新握緊單杠!
眼神里爆發(fā)出前所未有的光芒!
那是一種混合了“老子拼了”的狠勁和“有救了”的狂喜!
“第九個(gè)!”他低吼一聲,雙臂肌肉賁張,身體猛地向上!
動(dòng)作標(biāo)準(zhǔn)有力!同時(shí),脖子上的錄音機(jī)隨著他的動(dòng)作晃蕩著,林修冰冷的聲音如同戰(zhàn)鼓般擂響:“……以及皮亞諾余項(xiàng):Rn(x) = o((x - x0)^n) (x→x0) ……”
“第十個(gè)!”下巴再次輕松過杠!汗水順著額角滾落,滴在冰冷的單杠上。
“……泰勒公式的應(yīng)用:近似計(jì)算、求極限、證明不等式……”
“第十一個(gè)!十二個(gè)!十三個(gè)!……”趙明陽的動(dòng)作越來越快,越來越穩(wěn)!
每一次發(fā)力都伴隨著錄音機(jī)里清晰吐出的公式片段!
那些原本如同天書的數(shù)學(xué)符號(hào),此刻仿佛化作了注入他肌肉的力量源泉!
他不再去想公式本身,只是讓那冰冷的聲音引導(dǎo)著身體的節(jié)奏!
上拉,是定義!
下落,是展開式!
每一次呼吸,都對(duì)應(yīng)著余項(xiàng)的表述!
體育老師張著嘴,看著這個(gè)脖子上掛著個(gè)“數(shù)學(xué)法寶”、如同打了雞血般瘋狂輸出引體向上的家伙,徹底無語了。
旁邊的同學(xué)更是目瞪口呆,有人忍不住笑出聲,有人則是一臉“這也行?”的震驚。
程曉菲在跑道邊笑得前仰后合,用力拍著俞小舟的肩膀。
俞小舟也捂著嘴,眼睛彎成了月牙,擔(dān)憂被笑意取代。
林修依舊沒什么表情,只是看著單杠上那個(gè)隨著身體起伏而晃動(dòng)的黑色錄音機(jī),鏡片后的目光似乎微微閃動(dòng)了一下,嘴角極其細(xì)微地向上牽動(dòng)了一毫米?
或許只是光影的錯(cuò)覺。
“二十個(gè)!”趙明陽一聲暴喝,完成最后一個(gè),穩(wěn)穩(wěn)落地!胸膛劇烈起伏,汗水浸透了背心。他一把抓住脖子上還在孜孜不倦播放“泰勒公式在物理中的應(yīng)用……”的錄音機(jī),用力按下了停止鍵。
世界瞬間清凈了。
他抬起頭,看向跑道邊,咧開嘴,露出一個(gè)混合著疲憊、狂喜和感激的、極其燦爛的笑容,對(duì)著404小隊(duì)的方向,用力揮了揮手里那個(gè)老舊的黑色錄音機(jī)。
寒風(fēng)依舊凜冽,但單杠下的趙明陽,卻感覺渾身都在冒著熱氣。
那冰冷的錄音機(jī)緊貼胸膛的地方,仿佛還殘留著公式的余溫,和一種難以言喻的力量。