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