情況1 需要讀入的數(shù)據(jù)是比較大的數(shù)據(jù),使用指針作為參數(shù)可以節(jié)省堆棧
網(wǎng)站建設哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設計、網(wǎng)站建設、微信開發(fā)、小程序開發(fā)、集團企業(yè)網(wǎng)站建設等服務項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了邯鄲免費建站歡迎大家使用!
比如 定義1個結構體
typedef struct test
{
char buffer1[10000];
char buffer2[10000];
//后面還有一大堆成員
}test_ts;
void Func1(test_ts t1)
{
//函數(shù)體是對t1成員進行Read處理
}
void Func2(test_ts *t1)
{
//函數(shù)體是對t1成員進行Read處理
}
上面2個函數(shù)功能其實一樣,但函數(shù)Func2參數(shù)只是一個指針占的空間就4 Byte,
Func1參數(shù)是一個結構體,占的空間就看成員多少,但例子的使用的堆棧最少20000Byte了。
情況2 需要對數(shù)據(jù)進行改寫
一般對應的數(shù)據(jù)是數(shù)組或結構體數(shù)據(jù)。
比如memset函數(shù)函數(shù),用于把傳入指針的數(shù)據(jù)寫入對應的數(shù)據(jù)。
具體函數(shù)體內容不貼了,baidu查下吧。
例如還是這個結構體test_ts
test_ts t2;
如果需要將t2的每個成員初始化成0,可以把每個成員挨個賦值成0。
但如果用下面這樣代碼
memset(t2,0,sizeof(t2));
一行搞定
簡單來說就是當你想靈活地訪問地址空間,并在不需要時將其釋放時,就可以考慮用指針。使用指針可以靈活地對地址空間進行操作,但是帶來方便的同時也經(jīng)常出現(xiàn)災難性的軟件問題。使用時要特別注意,任何時間使用指針都要保證指向正確的地址空間,它的內容至少在一定范圍內是“可預測的”。
1.什么時候都可以用指針,因為用指針的效率比用變量高。
2.當一個函數(shù)要返回1個以上的運算結果時,就必須用指針,因為一個函數(shù)只能返回一個值,更多的得用指針“帶回”。
3.操作數(shù)組時,用指針不僅方便得多而且代碼時效很高。
4.操作文件時,不用指針寸步難行。
5.利用指針可以簡化函數(shù)調用的書寫過程,使源代碼易于閱讀。
……不一而論。
任何時候都可以使用數(shù)組,使用指針。
定義時,通常只有字符指針,和字符數(shù)組指針直接定義。用來表示字符串或字符串數(shù)組。
其他一般定義數(shù)組。操作時用指針或數(shù)組。
其他指針,多半用在參數(shù)傳遞,數(shù)據(jù)結構內部(不確定需要內存的大小,或者鏈表,二叉樹等鏈式結構)的時候。
還有一種是有些函數(shù)參數(shù)就是指針,這時定義一個指針,來操作傳進來的指針參數(shù)比較好。
指針作為參數(shù),有一下幾種用法,
1)當作數(shù)組用,用來獲取或設置數(shù)組元素。
2)把一個比較長的數(shù)據(jù)結構傳入函數(shù),只需要一個指針就夠了。
3)傳入變量的地址,用來讀取或修改變量的值,主要是為了修改用。
直接定義一個不指向任何對象的指針,并且也從不給他賦值,沒什么意義;
指針要么指向數(shù)組,要么指向變量,要么動態(tài)申請內存。
NULL指針,只是一個方便的指針,表示不指向任何對象。
真正有用的還是指向具體對象的指針。
如果定義了一個指針,使用時要讓他指向一個具體對象,當需要他不指向什么對象的時候,給他賦值為NULL;
PS:
C語言,數(shù)組名只是一個指針常量而已,離開定義可見處,數(shù)組大小的信息就不存在了。
只有定義完全可見的地方,才可以獲得數(shù)組的大小。
數(shù)組作為函數(shù)的參數(shù),和外部引用聲明都不能獲得數(shù)組的大小。
參數(shù)只能傳遞指針,參數(shù)的大小只是指針的大??;
只能看到聲明的地方,獲取數(shù)組大小的努力,只能換來錯誤。
void fun1(int a[10]) //== void fun1(int a[]) ==void fun1(int *a)
{
}
void fun2(int [10][10])// ==void fun2(int a[][10])== void fun2(int (*a)[10])
{
}
1. 需要改變實參的時候, 只能用指針.
2. 傳遞大型結構并且"只讀"其元素的時候,
因為大型結構通過值傳遞, 需要拷貝其每個元素, 這樣效率太低.
3. 需要遍歷數(shù)組或頻繁引用其元素時, 這樣效率比使用下標高.
4. 動態(tài)分配空間時, 必須使用指針.
5. 傳遞數(shù)組時, 必須使用指針.
6. 函數(shù)返回指針時, 比如fopen
這是經(jīng)驗和技巧的問題, 多寫點代碼吧:)