六星云課堂:C語言指針使用技巧,值得收藏!

C語言的學(xué)習(xí)過程中,作為C語言的靈魂指針如果用的好猶如神助,用不好會(huì)讓你叫苦連連,但大多數(shù)人是用不好指針的,所以后來的很多語言都把指針封裝,屏蔽。比如Java,java是沒有指針的,但是很多地方都用到指針,不過不對(duì)用戶開放,語言的自身機(jī)制幫用戶處理指針的分配釋放,為的就是方便用戶使用,減少錯(cuò)誤。不過我們不能因噎廢食,指針雖難,但學(xué)好了會(huì)大大提升你的編程能力。

下面來列舉一下在學(xué)習(xí)過程中指針的常見錯(cuò)誤。
1. 指針和指針變量
很多初學(xué)者沒搞明白這兩者的區(qū)別,以至于很多時(shí)候把兩者等同了。在C語言中指針是一個(gè)概念性的東西,簡(jiǎn)單而言就是地址。而指針變量是變量類型,屬于int,float這類的,是用來存放指針的,也就是地址。但是很多時(shí)候我們說指針時(shí)是代指指針變量的,這點(diǎn)我們要知道。
2. 指針變量的地址和指針變量存放的地址
凡是變量都要有內(nèi)存來存放,指針變量也不例外,它也有一個(gè)地址,但是指針變量本身又是存放地址的,所以很多人會(huì)在這個(gè)地方搞不清楚,分不清什么時(shí)候是指針變量的地址,什么時(shí)候是指針變量存放的地址,尤其是在有二級(jí)指針或數(shù)組的時(shí)候。
3. 沒分配空間就給指針賦值
這是初學(xué)者很容易犯的錯(cuò)誤,我們來看一個(gè)例子。
char*p;//定義一個(gè)指針來存放字符串
scanf("%s",p);//會(huì)出錯(cuò)
此時(shí)的指針p是沒有指向任何有效的空間,看清楚是有效空間,并非是沒有指向內(nèi)存空間,定義的時(shí)候p就有值的了,是一個(gè)隨機(jī)值,指向一個(gè)不明的內(nèi)存空間,但是不合法 的,當(dāng)你去訪問的時(shí)候就會(huì)出錯(cuò)。
正確的寫法是:
char * p=(char*)malloc(sizeof(char)*size);//size 你所需的內(nèi)存大小。
scanf("%s",p);//注意這里不能寫成"&p",因?yàn)閜本身就存放了地址,不需再用取地址符了。
4. 用到二級(jí)指針來存放字符串時(shí)沒有分配到空間
我們常用字符串?dāng)?shù)組來存放一系列的字符串,但是不能動(dòng)態(tài)分配空間大小,要事先指定,這在很多時(shí)候是不行。所以我們要用到指針來存放,這時(shí)候就很容易出錯(cuò)了。
錯(cuò)誤一:
char**p;//定義一個(gè)二級(jí)指針來存放一系列字符串
for(i=0;i<size;i++)//size 字符串的個(gè)數(shù)
{
p[i]=(char*)malloc(sizeof(char)*len));//len 字符個(gè)數(shù)
}
錯(cuò)誤原因:p是一個(gè)二級(jí)指針用來存放一系列char*變量,但是我沒有給p分配內(nèi)存空間就直接用了。我只是給每一個(gè)p[i]分配了空間,但是還需要存放p[i]地址的內(nèi)存空間。也就是存放每一個(gè)字符串地址的內(nèi)存空間還沒有分配給p。
錯(cuò)誤二:
char**p;//定義一個(gè)二級(jí)指針來存放一系列字符串
p=(char**)malloc(sizeof(char*));
for(i=0;i<size;i++)//size 字符串的個(gè)數(shù)
{
p[i]=(char*)malloc(sizeof(char)*len));//len 字符個(gè)數(shù)
}
錯(cuò)誤原因:這是很網(wǎng)上多人的寫法,也是很常見的一種錯(cuò)誤,這里雖然給p分配了空間但是僅僅是分配了一個(gè)char*類型的空間,當(dāng)size超過1的時(shí)候,就會(huì)出錯(cuò)。
正確的寫法是:
char**p;//定義一個(gè)二級(jí)指針來存放一系列字符串
p=(char**)malloc(sizeof(char*)*size));//分配size個(gè)char*類型的內(nèi)存空間
for(i=0;i<size;i++)//size 字符串的個(gè)數(shù)
{
p[i]=(char*)malloc(sizeof(char)*len));//len 字符個(gè)數(shù)
}
5. 釋放空間
C語言中用free來釋放空間,一般用法是:
free(p);//這里釋放的是p指向的空間,存放p的內(nèi)存空間沒有被釋放。
p=NULL;//建議加上這句
分配空間:
char**p;//定義一個(gè)二級(jí)指針來存放一系列字符串
p=(char**)malloc(sizeof(char*)*size));//分配size個(gè)char*類型的內(nèi)存空間
for(i=0;i<size;i++)//size 字符串的個(gè)數(shù)
{
p[i]=(char*)malloc(sizeof(char)*len));//len 字符個(gè)數(shù)
}
釋放空間正確寫法:
for(i=0;i<size;i++)
free(p[i]);
free(p);
p=NULL;
以上就是本次分享的全部?jī)?nèi)容,想學(xué)習(xí)更多C++技巧,歡迎持續(xù)關(guān)注六星云課堂!