C指標應用常見繆誤

2021-09-30 05:50:53 字數 2304 閱讀 8840

前言:

一、文章中所說的c指的是ansi c,是由ansi/iso 9899-1990[ansi 90]進行定義並由[kern 89]進行描述的。

所有**的執行環境如下:

作業系統:中文版windowsxp professional+sp2

編輯器:vc6或vc7

文章中所舉的例子在上述環境中編譯通過,我也會盡量把問題表述清楚,但由於是第一次寫東西,再加上本人也是乙個初學者水平有限,文中難免有不清或錯誤的地方,在這裡請大家多提意見!

二、語法描述格式:

關於const限定修飾符書寫位置:

c語言與ans c中並未統一的標準。你可以寫在資料型別符前面如:const int (變數名)或後面如:int  const (變數名)。我傾向於前者也就是const int (變數名)原因就是方便閱讀吧(我們可以從右往左把這個定義讀為「(變數名)是乙個int型別的const(常量,值不能被更改)。

正文:   問題1:當指標是函式引數時的誤用。請先看一段**:

#include

#include

void u_p(char  *p);

void main (void)

else

system ("pause");  //暫停。

}void u_p(const char *p)

解釋:程式的願意是想在執行p = null後達到pstr = null。但實際上p是u_p()函式內,區域性自動變數。當函式執行完後,其值將自動的銷毀。p = null只是讓p自己賦個null值罷了(在這個函式體內,p賦不賦null值都無所謂),而free(p)只是釋放了pstr所指向動態生成的儲存空 間,pstr中的值(空間位址)依然存在,並不為空。所以在執行if (pstr == null) 判斷時通不過。此時,如果訪問pstr中的值,將會產生錯誤(因為值中所指位址,已經被系統**不存在了)這種指標是很危險的,稱為「懸掛」指標。

正確的方法:

void u_p(char **p)

void main (void)

else

system ("pause");  //暫停。

}問題2:const限定修飾符。請先看一段**:

const int ivalue = 5;

int *pvalue = &ivalue;

這是否可行?ivalue是乙個常量對像,因此它不能被改寫為乙個新值。但是pvalue是乙個普通指標,沒有什麼能阻止我們寫出這新的**:

*pvalue += 1; //修改了ivalue!

一般編譯器不能跟蹤指標在程式中任意一點指向的物件,[這種內部工作需要進行資料流分析(data flow analysis),通常由單獨的優化器(optimizer)元件來完成。]允許非const物件的指標指向乙個常量物件,把「試圖通過該指標間接改變 物件值」的動作標記為非法的,這種編譯器來說是不可行的。因而任何「試圖將乙個非const物件的指標指向乙個常量物件」的動作都將引起編譯錯誤(此段話 摘自<>中文第三版84頁)。

這並不意味著我們不能間接地指向乙個const物件,只意味著我們必須宣告乙個指向常量的指標來做這件事。

例如:const int *pvalue;  //這裡會產生乙個誤區,下面將說到。

pvalue是乙個指向int型別的const物件指標,(我們可以從右往左把這個定義讀為「pvalue是乙個指向int型別的、被定義成const的 物件指標」。)此中微妙在於pvalue本身不是常量。我們可以重新賦值給pvalue,使其指向不同物件,但不能修改pvalue指向的對像。例如:

const int *pc = 0;

const int value = 1;

pc = &value; //ok:不能通過pc修改value。

int value2 = 2;

pc = &value2; //ok,不能通過pc修改value2,雖然value2本身不是乙個常量。

我們還可以定義乙個"const指標"指向乙個非const物件。例如:

int errnumb = 0;

int *const curerr = &errnumb;

curerr是指向乙個非const物件的const指標。(我們可以從右往左把定義讀作"curerr是乙個指向int型別物件的const指標。)這 意味著不能賦給curerr其他的位址值,但可以修改curerr指向的值。指向const物件的const指標的定義就是前面兩種定義結合起來。例如:

const int value = 1;

const int *const p = &value;

這種情況下p指向的物件的值以及它的位址本身都不能被改變。(我們可以從右往左將定義讀作:"p是指向被定義為const的int型別物件的const指標"。)

快慢指標的常見應用

快慢指標 快慢指標是解決陣列和鍊錶問題的常用方法,該方法也被稱為 龜兔演算法 從名稱就可以看出氣基本思想是使用兩個指標以不同的速度在陣列或鍊錶中移動。在處理迴圈鍊錶或陣列時,此方法非常有用。快慢指標的應用 1 判斷單鏈表是否存在環 如果鍊錶存在環,就好像操場的跑道是乙個環形一樣,此時讓快慢指標都從煉...

C 指標應用

int main char str1 hello world char str2 hello world char str3 hello world char str4 hello world if str1 str2 printf str1and str2 are same n else prin...

雙指標法的常見應用

標籤 演算法 pivot null面試 2012 08 10 10 09 3247人閱讀收藏 舉報 資料結構 演算法 20 所謂雙指標,指的是在遍歷物件的過程中,不是普通的使用單個指標進行訪問,而是使用兩個相同方向或者相反方向的指標進行掃瞄,從而達到相應的目的。換言之,雙指標法充分使用了陣列有序這一...