程式設計的那些小事(1)內斂函式 指標

2021-06-21 10:02:57 字數 2178 閱讀 1070

在這裡總結自己關於程式設計過程中的一些想法、深究和思考。

一、內斂函式和巨集定義

巨集定義源自c語言,可以作為不斷重複常量、簡單表示式的替代解決方案;而內聯函式是在c++中使用的較為普遍,其作用和巨集函式相差不多。但在c++中,內聯函式需要做型別檢查,所以較於巨集函式更加安全,另外,內聯函式是由嵌入**實現而非中斷呼叫實現,所以使用內聯函式的情況最好遵循兩個原則:一、乙個函式被不斷的重複呼叫;二、函式內部比較簡單,沒有諸如(for,if,switch等語句)。對於巨集定義是建議就是最好不要使用,因為安全性、可靠性的考慮。

最後還有一點:

巨集定義不是函式,它是預編譯階段將相關字串替換成巨集體;而內聯函式是函式,但在編譯中不單獨產生,而是將有關**嵌入到呼叫處。

二、指標和引用

(1)函式中的臨時指標變數造成『記憶體洩漏』

最常見的一種情況如下:

void getmemory(char *p, int num)//獲取記憶體空間

void swap(int *p, int *q)//交換兩個數

這兩個函式所產生的錯誤是一樣的:都是記憶體洩漏。首先需要明確一點,任何向函式傳遞的引數,在函式體的內部其實都是所傳值的乙個副本。那麼getmemory中實質上是對副本指標分配了一塊記憶體空間,可是函式執行完臨時的指標被釋放掉,但所申請的空間還在那裡,可缺少了必要的指向就變成了一段死空間而產生記憶體洩漏,這在vs下會產生執行時錯誤。swap中temp指標所產生的錯誤也是一樣的。

關於獲取記憶體空間的方法可以採用函式返回指標值,和傳遞指向指標的指標的方法來完成。後者**如下:

void getmemory(char **p,int num)

三、當指標碰上陣列

有這樣乙個觀點需要牢記:陣列名本身就是指標,再加上&就變成了雙指標,雙指標就是指二維陣列,加1就是加1行。舉個例子如下:

int a = ;

int *ptr = (int *)(&a + 1);

printf("%d",*(ptr-1));

輸出為5,因為*ptr指向a的第六個元素(儘管其不存在)。

另外,陣列和指標容易讓人混肴的兩個概念就是指標陣列和陣列指標,其實從字面上就很好區分,方法就是將重音放在後尾,指標陣列是陣列其元素為指標,陣列指標是指標其指向為陣列。

四、指標和windows控制代碼

指標好理解就是某個物理記憶體位址的標記。而控制代碼所代表的含義自從學windows程式設計以來就一直比較含糊,總覺得是個像位址又不是位址的東西,所以在這裡我就深入淺出、言簡意賅的講一下控制代碼到底是什麼:

首先說一下它的本質,windows控制代碼就是乙個指向指標的指標,稍微具體一點,控制代碼是乙個32位的整數,windows在記憶體中維護的記憶體實體地址的整數索引。然後要說一下他為什麼是這樣子,就要了解一下windows作業系統的一些基本知識,windows是乙個以虛擬記憶體為基礎的作業系統,其記憶體管理器經常在記憶體中來回移動物件,以滿足各種應用程式對記憶體的需要,記憶體被移動就意味著其實際的實體地址發生了變化。為了方便應用程式找到實體地址,作業系統為各應用程式騰出了一些實際的物理記憶體位址,專門用來存放物件在記憶體中位址的變化,而作業系統專門騰出的這個位址是不會發生變化的。所以作業系統在改變應用的記憶體位址後會將改變的位址存到這個專門的記憶體塊中(即叫做控制代碼),應用程式只需要讀這個控制代碼就可以了。很好的遮蔽了應用程式對於記憶體位址的過多關注,這樣方便而且穩定。

五、智慧型指標auto_ptr

智慧型指標存在的目的是為了程式的的健壯性,試想有如下程式:

void fun()

這個**初看,開闢一塊記憶體並賦以指標,函式執行完釋放空間。看似正確,但是如果在/*更多的***/部分發生一些問題,比如說:提前返回,異常丟擲等問題使得delete語句執行不到,那就產生了記憶體洩漏的經典問題。

所以為了避免上述問題的產生,我們可以使用智慧型指標,實現原理很簡單:使用乙個智慧型指標類模板,在構造時獲取資源,在析構時釋放資源並進行相關的指標操作。最常用的智慧型指標是標準c++庫中的auto_ptr,其也只是智慧型指標中的一種。其使用格式如下:

std::auto_ptrpa(new classa)//std沒有加入標頭檔案時需要引用名字空間

企業資料指標的那些「小事」兒

本文作者 子璽 袋鼠雲資料中臺解決方案專家。擁有近10年大資料從業經驗,擁有pmp專案管理資格認證,精通資料類專案的開發實施和管理。曾服務過國家工商總局 北京市工商局 北京市財政局 廣州開發區大資料局 平湖人社局 海鹽人社局等行政單位,擔任多個大型資料專案的資料應用諮詢顧問 專案經理。一 企業指標體...

C語言的那些小秘密之函式指標

我們經常會聽到這樣的說法,不懂得函式指標就不是真正的c語言高手。我們不管這句話對與否,但是它都從側面反應出了函式指標的重要性,所以我們還是有必要掌握對函式指標的使用。先來看看函式指標的定義吧。函式是由執行語句組成的指令序列或者 這些 的有序集合根據其大小被分配到一定的記憶體空間中,這一片記憶體空間的...

C語言的那些小秘密之函式指標

函式是由執行語句組成的指令序列或者 這些 的有序集合根據其大小被分配到一定的記憶體空間中,這一片記憶體空間的起始位址就成為函式的位址,不同的函式有不同的函式位址,編譯器通過函式名來索引函式的入口位址,為了方便操作型別屬性相同的函式,c c 引入了函式指標,函式指標就是指向 入口位址的指標,是指向函式...