空指針有以下三種用法:
創(chuàng)新互聯(lián)專注于企業(yè)全網營銷推廣、網站重做改版、清豐網站定制設計、自適應品牌網站建設、成都h5網站建設、成都商城網站開發(fā)、集團公司官網建設、成都外貿網站制作、高端網站制作、響應式網頁設計等建站業(yè)務,價格優(yōu)惠性價比高,為清豐等各大城市提供網站開發(fā)制作服務。
(1)用空指針終止對遞歸數(shù)據(jù)結構的間接引用。
遞歸是指一個事物由這個事物本身來定義。請看下例:
/*Dumb implementation;should use a loop */
unsigned factorial(unsinged i)
{
if(i=0 || i==1)
{
return 1;
}
else
{
return i * factorial(i-1);
}
}
在上例中,階乘函數(shù)factoriai()調用了它本身,因此,它是遞歸的。
一個遞歸數(shù)據(jù)結構同樣由它本身來定義。最簡單和最常見的遞歸數(shù)據(jù)結構是(單向)鏈表,鏈表中的每一個元素都包含一個值和一個指向鏈表中下一個元素的指針。請看下例:
struct string_list
{
char *str; /* string(inthiscase)*/
struct string_list *next;
};
此外還有雙向鏈表(每個元素還包含一個指向鏈表中前一個元素的指針)、鍵樹和哈希表等許多整潔的數(shù)據(jù)結構,一本較好的介紹數(shù)據(jù)結構的書中都會介紹這些內容。
你可以通過指向鏈表中第一個元素的指針開始引用一個鏈表,并通過每一個元素中指向下一個元素的指針不斷地引用下一個元素;在鏈表的最后一個元素中,指向下一個元素的指針被賦值為NULL,當你遇到該空指針時,就可以終止對鏈表的引用了。請看下例:
while(p!=NULL)
{
/*dO something with p-str*/
p=p-next;
}
請注意,即使p一開始就是一個空指針,上例仍然能正常工作。
(2)用空指針作函數(shù)調用失敗時的返回值。
許多C庫函數(shù)的返回值是一個指針,在函數(shù)調用成功時,函數(shù)返回一個指向某一對象的指針;反之,則返回一個空指針。請看下例:
if(setlocale(cat,loc_p)==NULL)
{
/* setlocale()failed;do something*/
/* ...*/
}
返回值為一指針的函數(shù)在調用成功時幾乎總是返回一個有效指針(其值不等于零),在調用失敗時則總是返回一個空指針(其值等于零);而返回值為一整型值的函數(shù)在調用成功時幾乎總是返回一個零值,在調用失敗時則總是返回一個非零值。請看下例:
if(raise(sig)!=0){
/* raise()failed;do something*/
/* ... */
}
對上述兩類函數(shù)來說,調用成功或失敗時的返回值含義都是不同的。另外一些函數(shù)在調用成功時可能會返回一個正值,在調用失敗時可能會返回一個零值或負值。因此,當你使用一個函數(shù)之前,應該先看一下它的返回值是哪種類型,這樣你才能判斷函數(shù)返回值的含義。
(3)用空指針作警戒值
警戒值是標志事物結尾的一個特定值。例如,main()函數(shù)的預定義參數(shù)argv是一個指針數(shù)組,它的最后一個元素(argv[argc])永遠是一個空指針,因此,你可以用下述方法快速地引用argv中的每一個元素:
/*
A simple program that prints all its arguments.
It doesn't use argc ("argument count"); instread.
it takes advantage of the fact that the last
value in argv ("argument vector") is a null pointer.
*/
# include stdio. h
# include assert. h
int
main ( int argc, char * * argv)
{
int i;
printf ("program name = \"%s\"\n", argv[0]);
for (i=l; argv[i] !=NULL; ++i)
printf ("argv[%d] = \"%s\"\n", i, argv[f]);
assert (i = = argc) ; / * see FAQ XI. 5 * /
return 0; / * see FAQ XVI. 4 * /
}
int?swap_any(void?*s,?void?*t,?unsigned?n)
{
int?i;
char?j;
for(i=1;i=n;i++)
{
j=*(char*)s;???//void?*強制轉換成?char?*
*(char*)s=*(char*)t;
*(char*)t=j;
s++;
t++;
}
s-n;?//
t-n;?//和上一句一樣沒有用!!
}
語言定義中說明,?每一種指針類型都有一個特殊值——?“空指針”?——?它與同類型的其它所有指針值都不相同,?它“與任何對象或函數(shù)的指針值都不相等”;
不要返回指向棧內存的指針或引用,因為棧內存在函數(shù)結束時會被釋放。
指針是個很強大的工具,可是正因為它太強大,所以要操作它不是件易事。操作不當造成的野指針,甚至會引起系統(tǒng)死機等比較嚴重的后果。
如果程序定義了一個指針,就必須要立即讓它指向一個我們設定的空間或者把它設為NULL,如果沒有這么做,那么這個指針里的內容是不可預知的,即不知道它指向內存中的哪個空間(即野指針),它有可能指向的是一個空白的內存區(qū)域,可能指向的是已經受保護的區(qū)域,甚至可能指向系統(tǒng)的關鍵內存,如果是那樣就糟了,也許我們后面不小心對指針進行操作就有可能讓系統(tǒng)出現(xiàn)紊亂,死機了
空指針:空指針是一個特殊的指針值,也是唯一一個對任何指針類型都合法的指針值。指針變量具有空指針值,表示它當時處于閑置狀態(tài),沒有指向有意義的東西。
通用指針:通用指針,它可以指向任何類型的變量。通用指針的類型用(void *)表示,因此也稱為void 指針。
野指針:野指針也就是指向不可用內存區(qū)域的指針。通常對這種指針進行操作的話,將會使程序發(fā)生不可預知的錯誤。
空指針是一個特殊的指針值,也是唯一一個對任何指針類型都合法的指針值。指針變量具有空指針值,表示它當時處于閑置狀態(tài),沒有指向有意義的東西。空指針用0表示,C語言保證這個值不會是任何對象的地址。給指針值賦零則使它不再指向任何有意義的東西。為了提高程序的可讀性,標準庫定義了一個與0等價的符號常量NULL.??? 程序里可以寫 p = 0;???? 或者 p = NULL; 兩種寫法都把p置為空指針值。相對而言,前一種寫法更容易使讀程序的人意識到這里是一個指針賦值。我們印象中C語言的指針都有類型,實際上也存在一種例外。
? 這里涉及到通用指針,它可以指向任何類型的變量。通用指針的類型用(void *)表示,因此也稱為void 指針。
? 野指針,也就是指向不可用內存區(qū)域的指針。通常對這種指針進行操作的話,將會使程序發(fā)生不可預知的錯誤。
“野指針”不是NULL指針,是指向“垃圾”內存的指針。人們一般不會錯用NULL指針,因為用if語句很容易判斷。但是“野指針”是很危險的,if語句對它不起作用。野指針的成因主要有兩種:
①指針變量沒有被初始化。任何指針變量剛被創(chuàng)建時不會自動成為NULL指針,它的缺省值是隨機的,它會亂指一氣。所以,指針變量在創(chuàng)建的同時應當被初始化,要么將指針設置為NULL,要么讓它指向合法的內存。
②指針p被free或者delete之后,沒有置為NULL,讓人誤以為p是個合法的指針。別看free和delete的名字惡狠狠的(尤其是delete),它們只是把指針所指的內存給釋放掉,但并沒有把指針本身干掉。通常會用語句if (p != NULL)進行防錯處理。很遺憾,此時if語句起不到防錯作用,因為即便p不是NULL指針,它也不指向合法的內存塊。
真正的空指針是說,這個指針沒有指向一塊有意義的內存,比如說:
char* k;
這里這個k就叫空指針.我們并未讓它指向任意地點.
又或者
char* k = NULL;
這里這個k也叫空指針,因為它指向NULL 也就是0,注意是整數(shù)0,不是'\0'
一個空指針我們也無法對它進行取內容操作.
空指針只有在真正指向了一塊有意義的內存后,我們才能對它取內容.也就是說要這樣
k = "hello world!";
這時k就不是空指針了.
這是賦值,前一句是把指針指向0,也就是變成空指針,后一句是給指針指向的變量賦值
前一句不會在fun之外產生影響,后一句會改變原變量的值
文章標題:c語言函數(shù)指針空指針 c語言定義空指針
新聞來源:http://muchs.cn/article28/docojjp.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供網頁設計公司、網站設計、虛擬主機、外貿建站、品牌網站制作、網站維護
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)