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

來源:21ic電子網java


指針用的好猶如神助,用很差會讓你叫苦連連,但大多數人是用很差指針的,因此後來的不少語言都把指針封裝,屏蔽。好比JAVA,java是沒有指針的,可是不少地方都用到指針,不過不對用戶開放,語言的自身機制幫用戶處理指針的分配釋放,爲的就是方便用戶使用,減小錯誤。不過咱們不能因噎廢食,指針雖難,但學好了會大大提高你的編程能力。編程


下面來列舉一下在學習過程當中指針的常見錯誤。數組



1.指針和指針變量微信

不少初學者沒搞明白這二者的區別,以致於不少時候把二者等同了。在C語言中指針是一個概念性的東西,簡單而言就是地址。而指針變量是變量類型,屬於int,float這類的,是用來存放指針的,也就是地址。可是不少時候咱們說指針時是代指指針變量的,這點咱們要知道。app



2.指針變量的地址和指針變量存放的地址編輯器

凡是變量都要有內存來存放,指針變量也不例外,它也有一個地址,可是指針變量自己又是存放地址的,因此不少人會在這個地方搞不清楚,分不清何時是指針變量的地址,何時是指針變量存放的地址,尤爲是在有二級指針或數組的時候。學習

 


3.沒分配空間就給指針賦值flex

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

  char*p;//定義一個指針來存放字符串url

  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;


若有疑問,歡迎留言討論。

若是以爲文章不錯,幫忙點轉發、在看,您的支持也是咱們繼續更新的動力。

公衆號聊天界面,回覆關鍵詞:加羣,可加入小熊派開源社區交流羣,期待您的到來~

往期回顧

本文分享自微信公衆號 - 小熊派開源社區(BearPi-Club)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索