c c 指標詳解(一)

2021-07-24 15:27:29 字數 1966 閱讀 3706

1、首先需要了解指標的作用

指標是用來存放資料位址的。就是說,開發者可以使用乙個指標變數,存放變數、函式、指標的位址。如int a=0;int *p=&a;這時就將a的位址存放在了變數p的記憶體空間中,不過這個變數p就是我們下來需要了解的指標變數。

2、既然指標變數中存放的是記憶體位址,能不能使用基本資料型別存放位址,而不引入指標型別?

而且指標變數還有另外乙個作用,按照指標變數的型別,訪問記憶體空間。如int *p;首先系統確定需要訪問的資料為int型別,然後呼叫sizeof函式獲得int型別的位元組長度len,最後從p存放的位址處開始,連續訪問len個位元組,即獲得乙個int行資料。

因此,如果需要使用位址,就需要引入指標型別。

3、指標作為引數時,需要注意的問題

我們知道函式的引數,既可以是值傳遞,也可以是引用傳遞,也可以傳遞指標。

對於值傳遞:基本的資料型別傳遞時不會有太大的影響,但是對於自定義資料型別、類物件傳遞時一般不要選擇值傳遞。減少產生臨時變數,影響效率。

引用傳遞:c++中的特有屬性,對於c語言是不適用的。能夠使用引用的地方,一定可以使用指標,但是可以使用指標的地方,不一定能夠使用引用

指標傳遞:最高效的傳參方式,不會有任何的臨時資料產生。

這裡最需要注意的就是,字元陣列作為引數時,出現的諸多問題: 1)

void getmemory(char* p,int num)

int main(void)

上面的c函式,到底會出現什麼問題了?

main函式中p和getmemory中的p不是一回事,main函式中的p只是乙個指標變數,它並沒有存放任何資料的位址,其實就是乙個變數的值傳遞,因此getmemory中的p只是main函式中p的乙個副本,因此p=(char*)malloc(num);將申請到的位址賦值給了乙個副本,這樣main函式中的p仍為null,因此執行strcpy函式是出錯;而且getmemory函式中呼叫了malloc函式,申請到的記憶體沒有被釋放,記憶體洩露。

2)基於上面傳遞變數副本的錯誤,我們可以傳遞p的位址給getmemory函式

void getmemory(char** p,int num)

int main(void)

現在我們將main函式中指標變數p的位址傳遞給了getmemory函式,因此*p=(char*)malloc(num);這樣就將申請到的記憶體空間的首位址傳賦值給了p,函式可以正確執行。

3)當然我們也可以使用變數的副本

char* getmemory(int num)

int main(void)

getmemory函式中的char*p確實是乙個區域性變數,在該函式結束後,該變數的記憶體就會被釋放,這樣不是就錯了嗎。其實這樣理解只對了一半。我們知道malloc函式是從堆空間申請記憶體的,堆空間的記憶體如果開發者不顯式的free掉,就會出現記憶體洩露,只有當程式異常退出後,系統才會**記憶體。只要malloc申請記憶體成功,那麼只要沒有free掉,就會一直存在,char *p這個區域性變數的記憶體被釋放了,但是malloc申請的記憶體還沒有被釋放,因此執行return p;就相當於將申請的記憶體的首位址返回給了主調函式。就相當於用區域性變數接收了全域性變數的位址(這個在鍊錶、樹、圖中經常用到)。

因此該函式可以正常執行。 4)

char* getmemory(int num)

;return p;

}int main(void)

其實getmemory函式中的char p=;這個字元陣列是乙個區域性變數,函式執行完成後,p空間會被函式,所有main函式中strcpy函式執行錯誤。注意3)和4)的不同。 5)

char* getmemory(int num)

int main(void)

上面的這段**,眨一看好像是正確的,其實一半正確,一半錯誤。getmemory函式可以正常返回。但是strcpy函式執行失敗。hello是乙個字串常量,它被存放在靜態儲存區,因此試圖改變常量記憶體,函式執行失敗!

今天的內容就先更新這些,如果有新的內容將盡早更新,謝謝大家閱覽,有不對之處,請各位親們批評指正。

c c 函式指標詳解

今天我們要介紹的是函式指標。內容由以下3部分組成 函式指標的概念,為了面試時能夠說出來。函式指標的用法 當然是為工作用到嘍 函式指標的例項,用一些練習來加深印象。經典面試題 函式指標和指標函式的區別 好 開始!函式指標的概念 1.1 函式指標 是指向函式的指標變數 在程式執行中,函式是程式演算法指令...

詳解C C 函式指標宣告

要理解乙個c程式,僅僅理解組成該程式的符號是不夠的。程式設計師還必須理解這些符號是如何組合成宣告 表示式 語句和程式的。我們先來看看下面的乙個語句 1 void 0 這是當計算機啟動時,硬體將呼叫首位址為0位置的子例程。像這樣的表示式恐怕會令每個c c 程式設計師的內心都 不寒而慄 吧。然而,完全不...

詳解C C 函式指標宣告

要理解乙個c程式,僅僅理解組成該程式的符號是不夠的。程式設計師還必須理解這些符號是如何組合成宣告 表示式 語句和程式的。我們先來看看下面的乙個語句 1 void 0 這是當計算機啟動時,硬體將呼叫首位址為0位置的子例程。像這樣的表示式恐怕會令每個c c 程式設計師的內心都 不寒而慄 吧。然而,完全不...