原创 修改任意 commit

  目前在公司實習,兩週了, 很多東西要學,博客更新慢,敬請見諒!   上一篇博客中提到了未 push 的 commit 都可以修改, 這一篇就來演示一下。 修改上次提交的 commit   git 直接提供了修改上次提交的 com

原创 被開源折騰

在公司實習的時候我成功地從“免費”的UltraEdit轉向了開源的Notepad。 一開始覺得Notepad沒UltraEdit好用——沒有十六進制

原创 git 兩個給力的應用場景

  git 能給開發者帶來不少便利,這裏我就講兩個場景。 revert   revert 是恢復的意思,用過 svn 的同學應該都對 svn 的 revert 操作讚不絕口:它能把未提交的修改一鍵丟棄。它的應用場景就是我在git版本管理的

原创 函數幀

函數幀   這標題一念出來我立刻想到了一個名人:白素貞……當然,此女與本文無關,下面進入正題: 其實程序運行就好比一幀一幀地放電影,每一幀是一次函數調用,電影放完了,我們就看到結局了。   我們用一個遞歸求解階乘的程序來看看這個放映過程

原创 C語言的棧是靜態的

C語言的棧是靜態的   C語言有了可變參數之後,我們可以傳任意個數的參數了,似乎挺動態的了,但是可變參數函數還是不夠動態。 一、鞭長莫及   我們可以在 main 中寫出好幾條參數個數不同的調用 sum 的語句,但是具體到某一條語句,s

原创 誰調用了main?

誰調用了main?   這是函數幀的應用之一。 操作可行性   從上一篇中可以發現:用幀指針 ebp 可以回溯到所有的函數幀,那麼 main 函數幀之上的函數幀自然也是可以的;而幀中 舊ebp 的上一個四字節存的是函數的返回地址,由這個

原创 函數指針

函數指針 一、函數指針的值   函數指針跟普通指針一樣,存的也是一個內存地址,只是這個地址是一個函數的起始地址,下面這個程序打印出一個函數指針的值(func1.c): #include <stdio.h> typedef int (*

原创 彙編實現的動態棧

彙編實現的動態棧   這一篇就是實現 d_printf,廢話不多說,直接上代碼。由於 VC 的內聯彙編還是比較清晰,那就先貼 VC 版的。 一、d_printf VC版 #include <stdio.h> void d_printf

原创 鏈表

Warring: 本篇文章純粹是爲了勾引你去使用 stl 或 java 集合類,未必面面俱到,在文末我會推薦一些其他鏈接。   大三以前我一直沒寫過什麼大程序,一個程序頂多兩三百行了事,總是不停地重造車輪:每個程序都重寫一遍鏈表、棧、隊列

原创 字符串

字符串   這一篇分析字符串,字符串經常被使用,但是它的祕密也不少: 一、字符串的存儲位置   C源程序(string1.c): #include <stdio.h> int main() { puts("Hello, Wor

原创 內聯彙編

內聯彙編   內聯彙編是指在 C/C++ 代碼中嵌入的彙編代碼,與全部是彙編的彙編源文件不同,它們被嵌入到 C/C++ 的大環境中。 一、gcc 內聯彙編   gcc 內聯彙編的格式如下: asm ( 彙編語句 : 輸出操作數

原创 結構體

結構體   結構體是 C 語言主要的自定義類型方案,這篇就來認識一下結構體。 一、結構體的形態   C源程序(struct.c): #include <stdio.h> typedef struct{ unsigned sho

原创 變量名、函數名

變量名、函數名   C程序在執行的時候直接用內存地址去定位變量、函數,而不是根據名字去搜索,所以C程序執行的速度比腳本語言要快不少。   對於函數中的局部變量來說,編譯爲彙編的時候,名字就已經被徹徹底底地忘記了,因爲局部變量在函數幀中,

原创 可變參數

可變參數    C語言的可變參數的實現非常巧妙:大師只用了 3 個宏就解決了這個難題。 一、可變參數的應用   這裏實現一個簡單的可變參數函數 sum:它將個數不定的多個整型參數求和後返回,其第 1 個參數指明瞭要相加的數的個數(va.

原创 所有遞歸都可以變循環

所有遞歸都可以變循環   這是函數幀的應用之二。   還記得大一的C程序設計課上講到漢諾塔的時候老師說: 所有遞歸都可以用循環實現。這聽起來好像可行,然後我就開始想怎麼用循環來解決漢諾塔問題,我大概想了一個星期,最後終於選擇了……放棄…