指標陣列:一個普通陣列,但其型別由元素型別決定,每一個元素是一個指標。
陣列指標:指向一個數組的第一個元素的指標,透過偏移量可得到該陣列指定下目標的元素。
指標函式:是一個普通函式,但它的返回值是一個指標。
函式指標:是一個指向一個函式的指標,可以把這個指標作為引數傳進去,呼叫者用這個指標可以呼叫對應的函式,.NET裡的delegate應該是使用這種機制實現的。
其實指標可以實現一些非常叼的功能,當年我就用一個指標陣列,儲存一些函式的指標,然後把這個陣列的指標作為引數傳到呼叫方,呼叫方可以方便地根據需要,選擇陣列中不同的指標對應的函式來進行呼叫,實現了靈活的函式陣列,例如這實現一個遙控器功能的程式,把每個按鈕的功能寫成一個函式,然後的把這些函式的指標裝入一個數組,根據陣列的下標來呼叫不同的函實,實現不同的功能。這種做法也是挺美妙的。
不過成也指標,敗也指標,事物必然有兩面性的,指標的強大,令C程式設計師牛逼起來,但如果管理得不好,也會很慘的。如上面提出的陣列指標,透過確定首元素地址 +偏移量來訪問元素,若你把這個偏移量搞錯了,訪問了這個陣列以外的地址空間,後果可以是很糟糕的,例如我設計過一個影片監控程式的控制協議,其實就是傳一堆結構體過去,然後根據預先的約定,來分解哪一個位置的第幾位表示什麼操作,我們在很多次使用這個協議的時候,偏移量算錯了,改寫了錯誤的位置的值,程式沒有出現錯誤,可產生了錯誤的控制效果,這比程式崩潰更糟糕,後者還比較容易發現,前者是產生一些錯誤的效果,更難排查。
指標陣列:一個普通陣列,但其型別由元素型別決定,每一個元素是一個指標。
陣列指標:指向一個數組的第一個元素的指標,透過偏移量可得到該陣列指定下目標的元素。
指標函式:是一個普通函式,但它的返回值是一個指標。
函式指標:是一個指向一個函式的指標,可以把這個指標作為引數傳進去,呼叫者用這個指標可以呼叫對應的函式,.NET裡的delegate應該是使用這種機制實現的。
其實指標可以實現一些非常叼的功能,當年我就用一個指標陣列,儲存一些函式的指標,然後把這個陣列的指標作為引數傳到呼叫方,呼叫方可以方便地根據需要,選擇陣列中不同的指標對應的函式來進行呼叫,實現了靈活的函式陣列,例如這實現一個遙控器功能的程式,把每個按鈕的功能寫成一個函式,然後的把這些函式的指標裝入一個數組,根據陣列的下標來呼叫不同的函實,實現不同的功能。這種做法也是挺美妙的。
不過成也指標,敗也指標,事物必然有兩面性的,指標的強大,令C程式設計師牛逼起來,但如果管理得不好,也會很慘的。如上面提出的陣列指標,透過確定首元素地址 +偏移量來訪問元素,若你把這個偏移量搞錯了,訪問了這個陣列以外的地址空間,後果可以是很糟糕的,例如我設計過一個影片監控程式的控制協議,其實就是傳一堆結構體過去,然後根據預先的約定,來分解哪一個位置的第幾位表示什麼操作,我們在很多次使用這個協議的時候,偏移量算錯了,改寫了錯誤的位置的值,程式沒有出現錯誤,可產生了錯誤的控制效果,這比程式崩潰更糟糕,後者還比較容易發現,前者是產生一些錯誤的效果,更難排查。