1. 程式人生 > 實用技巧 >C語言指標用得好猶如神助!這些使用技巧值得收藏!

C語言指標用得好猶如神助!這些使用技巧值得收藏!

指標用的好猶如神助,用不好會讓你叫苦連連,但大多數人是用不好指標的,所以後來的很多語言都把指標封裝,遮蔽。

比如JAVA;java是沒有指標的,但是很多地方都用到指標,不過不對使用者開放,語言的自身機制幫使用者處理指標的分配釋放,為的就是方便使用者使用,減少錯誤。不過我們不能因噎廢食,指標雖難,但學好了會大大提升你的程式設計能力。

下面來列舉一下在學習過程中指標的常見錯誤:

1、指標和指標變數

很多初學者沒搞明白這兩者的區別,以至於很多時候把兩者等同了。

在C語言中指標是一個概念性的東西,簡單而言就是地址。

而指標變數是變數型別,屬於int,float這類的,是用來存放指標的,也就是地址。

但是很多時候我們說指標時是代指指標變數的,這點我們要知道。

2、指標變數的地址和指標變數存放的地址

凡是變數都要有記憶體來存放,指標變數也不例外,它也有一個地址;

但是指標變數本身又是存放地址的,所以很多人會在這個地方搞不清楚,分不清什麼時候是指標變數的地址,什麼時候是指標變數存放的地址,尤其是在有二級指標或陣列的時候。

3、沒分配空間就給指標賦值

這是初學者很容易犯的錯誤,我們來看一個例子。

char*p;//定義一個指標來存放字串

scanf("%s",p);//會出錯

此時的指標p是沒有指向任何有效的空間,看清楚是有效空間,並非是沒有指向記憶體空間,定義的時候p就有值的了,是一個隨機值,指向一個不明的記憶體空間,但是不合法 的,當你去訪問的時候就會出錯。

正確的寫法是:

char * p=(char*)malloc(sizeof(char)*size); //size 你所需的記憶體大小。

scanf("%s",p); //注意這裡不能寫成"&p",因為p本身就存放了地址,不需再用取地址符了。

4、用到二級指標來存放字串時沒有分配到空間

我們常用字串陣列來存放一系列的字串,但是不能動態分配空間大小,要事先指定,這在很多時候是不行。

所以我們要用到指標來存放,這時候就很容易出錯了。

◑錯誤一:

char**p;//定義一個二級指標來存放一系列字串

    for(i=0;i<size;i++)//size 字串的個數

    {

      p[i]
=(char*)malloc(sizeof(char)*len));//len 字元個數     }

錯誤原因:p是一個二級指標用來存放一系列char*變數,但是我沒有給p分配記憶體空間就直接用了。我只是給每一個p[i]分配了空間,但是還需要存放p[i]地址的記憶體空間。也就是存放每一個字串地址的記憶體空間還沒有分配給p.

◑ 錯誤二:

char**p;//定義一個二級指標來存放一系列字串

    p=(char**)malloc(sizeof(char*));

    for(i=0;i<size;i++)//size 字串的個數

    {

      p[i]=(char*)malloc(sizeof(char)*len));//len 字元個數

    }

錯誤原因:這是很網上多人的寫法,也是很常見的一種錯誤,這裡雖然給p分配了空間但是僅僅是分配了一個char*型別的空間,當size超過1的時候,就會出錯。

正確寫法:

    char**p;//定義一個二級指標來存放一系列字串

    p=(char**)malloc(sizeof(char*)*size));//分配size個char*型別的記憶體空間

    for(i=0;i<size;i++)//size 字串的個數

    {

      p[i]=(char*)malloc(sizeof(char)*len));//len 字元個數

    }

5、釋放空間

 C語言中用free來釋放空間,一般用法是:

   free(p); //這裡釋放的是p指向的空間,存放p的記憶體空間沒有被釋放。

   p=NULL; //建議加上這句

 分配空間:

    char**p;//定義一個二級指標來存放一系列字串

    p=(char**)malloc(sizeof(char*)*size));//分配size個char*型別的記憶體空間

    for(i=0;i<size;i++)//size 字串的個數

    {

      p[i]=(char*)malloc(sizeof(char)*len));//len 字元個數

    }

釋放空間正確寫法:

    for(i=0;i<size;i++)

      free(p[i]);

    free(p);

    p=NULL;

最後,不管你是轉行也好,初學也罷,進階也可,如果你想學程式設計~

【值得關注】我的 C/C++程式設計學習交流俱樂部!

問題答疑,學習交流,技術探討,還有超多程式設計資源大全,零基礎的視訊也超棒~