工作也快7年了,前面6年都在寫C的代碼,最近一年開始寫C#的代碼,估計以后用C的機會可能會變少,寫寫這幾年用C的一些思考吧,有些問題也是我經常面試別人用的,希望在園子里有需要的兄弟看到。
開門見山我就直接說了,和標題一樣,C語言中都說指針高效,那么到底指針高效靈活在那呢?
在上學的時候從譚浩強的C語言書中學習指針,當時我記得書中舉得例子是,打開一個抽屜,有兩種辦法,一種是將鑰匙帶着身上,一種是將鑰匙放在另一個抽屜中,顯而易見第一種就是我們一邊的變量(如int,short,float,struct 等等基本的變量)。而第二種就是指針變量(如int*,short*,float*,struct*等等),也就是所謂的間接訪問。
從上面的介紹來看,間接訪問也就是指針的這種訪問怎么能高效呢?答案是,這種訪問方式在單個變量上來看就是 不高效 。可以為什么大家都說指針高效,在這塊根本就不高效為什么要用這個例子呢?我想應該是譚老師為了吧指針的原理和定義給大家說的更簡單一點吧!
可能有人會問了,那么要指針有什么用?
我還是要說指針高效啊!請注意,上面的舉例在解釋指針上確實是正確的,指針原理就是這么回事?但是如果只是單一的變量確實是低效的
int i = 0;
int * p = &i;
*p = 5;
i = 6;
在這種情況下指針變量P的訪問效率和整形變量i的效率誰高呢?着個例子就和剛才說的抽屜是一樣的,顯然i的訪問效率要高一點
先講講用i來賦值,程序將會直接取到i變量的內存地址,然后操作着個內存地址進行賦值。
而對於p,程序會先取得p變量的內存地址,然后從p的內存地址中讀到i變量的內存地址,在用讀到的這個i變量的內存地址進行賦值,是不是顯然多走了一步(讀取i的內存地址),請注意p也是一個變量,p的變量中存放的就是i的地址值(掃一下盲)
在上面的例子中可以看出指針的使用是低效的!
下面再來看看指針的高效,到底是怎么用,其實很多用法,我還是舉一個讓大家理解一下原理的例子和剛才相似的例子
struct aa
{
int gg[1000];
char p;
} mm;
void Test1(struct aa b);
void Test2(struct aa *p);
大家一看這個例子就明白了,struct aa 中包含了一個含有1000個元素的數組和一個char(char只為湊個數),如果我們使用Test1這個函數回發生什么情況,實參需要向形參拷貝數據,這么大的數據量,你認為會快嗎,顯然不會,那如果用Test2函數呢,直傳一個指針,不需要進行數據的拷貝,是不是效率就高了,雖然使用指針會間接訪問這個struct這個變量降低效率,但是和拷貝大的數據相比,降低的效率和提升的效率簡直是9牛1毛
后面會再給大家講講指針的靈活,到底靈活在哪里?