陣列與指標

2021-08-15 03:12:22 字數 4905 閱讀 9083

1、在字串的指定位置插入乙個字元。

#include

#include

int main()

;char ptr[20]=;

scanf("%s%d %c",str, &num, &ch);

length = strlen(str);

/*for(i = 0; i < length-num+1; i++)

a[num - 1] = ch;*/

/*strncpy(ptr,str, num - 1);

strncpy(ptr + num - 1, &ch, 1);

strcpy(ptr + num, str + num - 1);

*/strncat(ptr, str, num - 1);

strncat(ptr, &ch, 1);

strcat(ptr, str + num - 1);

printf("%s\n",ptr);

return 0;

}2、概述函式的呼叫過程。

1)通過函式名找到函式入口;

2)給形參分配空間(一般存在棧空間,只有被 static 修飾的區域性變數會存在資料段中);

3)傳值(值傳遞;位址傳遞);

4)執行函式體;

5)返回主函式,給出返回值(不要返回區域性變數的位址);

6)釋放空間(棧空間)。

3、什麼是指標?指標有什麼特性?

指標其實就是存有位址的變數,就和其他變數一樣,他也有著自己的型別,唯一的區別就是,他在定義時需要加乙個*號,就比如這樣,int *p, 在32位的編譯器下,指標都是4個位元組。指標身為變數,當然也可以進行正常的加減,但是它與普通變數的運算不同的是,指標的加減所加所減的是指標所指向的型別。

系統為指標分配記憶體空間;

指標有自己的位址;

指標能夠存值,但這些值比較特殊——位址。

4、指標的型別和指標所指向的型別

1)指標的型別:把指標宣告語句裡的指標名字去掉,剩下的部分就是這個指標的型別,這是指標本身所具有的型別。

2)指標所指向的型別:把指標宣告語句中的指標名字和名字左邊的指標宣告符「*」去掉,剩下的就是指標所指向的型別。

5、指標的運算

1.算術運算

c的指標的算術運算只侷限於兩種形式。

第一種形式是:    指標+-整數  

標準定義這種形式只能用於指向陣列中某個元素的指標,並且這類表示式的結果型別也是指標。這種形式也適用於使用malloc函式動態分配獲得的記憶體。

對乙個指標加1使它指向陣列中的下乙個元素,加5使它向右移動5個元素的位置,依次類推。把乙個指標減去3使它向左移動3個元素的位置。

第二種型別的指標運算具有如下的形式:   指標-指標

只有當兩個指標都指向同乙個陣列中的元素時,才允許從乙個指標減去另乙個指標,兩個指標相減的結果的型別是ptrdiff_t,它是一種有符合整數型別。減法運算的值是兩個指標在記憶體中的距離(以陣列元素的長度為單位,而不是以位元組為單位),因為減法運算的結果將除以陣列元素型別的長度。

如果兩個指標所指向的不是同乙個陣列中的元素,那麼它們之間相減的結果是未定義的。程式設計師無從知道兩個陣列在記憶體中的相對位置,如果不知道這一點,兩個指標之間的距離就毫無意義。

2.關係運算:   <   <=   >   >=  

不過前提是它們都指向同乙個陣列中的元素。根據你所使用的操作符,比較表示式將告訴你哪個指標指向陣列中更前或更後的元素。標準並未定義如果兩個任意的指標進行比較會產生什麼結果。

6、常量指標和指標常量

常量指標:即指向乙個常量的指標,指向的內容是常量,不可修改,放在常量區的,但指標本身可以修改,即 " *p = 'b' " 是非法的,*p 是 p 指向的常量的第乙個字元,是個常量,不能改變的。「 p = &q 」是可以的,指標可以指向不同的位址。

指標常量:即指標本身是個常量,不可修改,但指標指向的內容可以修改,一開始定義時讓它指向陣列 a,「*p = 『b』」這是可以的,但「p = &b 」是非法的。

總之,當 const 在 * 之前就是常量指標,而 const 在 * 之後就是指標常量。常量指標指向的內容不可變,但位址可以改變,即指標可以指向別的位址;而指標常量是指標本身不可變,而內容可以修改。

7、空指標的用法

1)用空指標終止對遞迴資料結構的間接引用;

2)用空指標進行函式呼叫失敗時的返回值;

3)用空指標作警戒值。

8、指標陣列與陣列指標

指標陣列:指標陣列可以說成是」指標的陣列」,首先這個變數是乙個陣列,其次,」指標」修飾這個陣列,意思是說這個陣列的所有元素都是指標型別,在32位系統中,指標佔四個位元組。

陣列指標:陣列指標可以說成是」陣列的指標」,首先這個變數是乙個指標,其次,」陣列」修飾這個指標,意思是說這個指標存放著乙個陣列的首位址,或者說這個指標指向乙個陣列的首位址。 

根據上面的解釋,可以了解到指標陣列和陣列指標的區別,因為二者根本就是種型別的變數。

9、字串函式

1、字串操作 

strncpy(p, p1, n) 複製指定長度字串 

strncat(p, p1, n) 附加指定長度字串 

strcasecmp 忽略大小寫比較字串

strncmp(p, p1, n) 比較指定長度字串 

strchr(p, c) 在字串中查詢指定字元 

strrchr(p, c) 在字串中反向查詢

strpbrk(p, p1) 以目標字串的所有字元作為集合,在當前字串查詢該集合的任一元素 

strspn(p, p1) 以目標字串的所有字元作為集合,在當前字串查詢不屬於該集合的任一元素的偏移 

strcspn(p, p1) 以目標字串的所有字元作為集合,在當前字串查詢屬於該集合的任一元素的偏移  

2、字串到數值型別的轉換 

strtod(p, ppend)   從字串 p 中轉換 double 型別數值,並將後續的字串指標儲存到 ppend 指向的 char* 型別

儲存。strtol(p, ppend, base) 從字串 p 中轉換 long 型別整型數值,base 顯式設定轉換的整型進製,設定為 0 以根據特

定格式判斷所用進製,0x, 0x 字首以解釋為十六進製制格式整型,0x 字首以解釋為八進位制格式整型

atoi(p)   字串轉換到 int 整型 

atof(p)   字串轉換到 double 符點數 

atol(p)   字串轉換到 long 整型

3、字元檢查 

isalpha() 檢查是否為字母字元 

isupper() 檢查是否為大寫字母字元 

islower() 檢查是否為小寫字母字元 

isdigit() 檢查是否為數字 

isxdigit() 檢查是否為十六進製制數字表示的有效字元 

isspace() 檢查是否為空格型別字元 

iscntrl() 檢查是否為控制字元 

ispunct() 檢查是否為標點符號 

isalnum() 檢查是否為字母和數字 

isprint() 檢查是否是可列印字元 

isgraph() 檢查是否是圖形字元,等效於 isalnum() | ispunct() 

4、函式原型

注意:同樣的,所有字串處理函式都包含在標頭檔案string.h中。

10、函式指標和指標函式

指標函式

指標函式就是返回指標值的函式,本質是乙個函式。所以指標函式等價於「返回值為指標的函式」。

定義指標函式的定義格式如下:函式型別 *函式名([引數列表])

當然,也可以讓指標標誌*與函式型別緊貼在一起,與函式名分開,其含義一致,格式如下:函式型別* 函式名([引數列表])

相比上一種,這種方式更能表示這是乙個指標函式。在將指標函式與函式指標區分時,也可以通過「指標標誌*能否和函式名分離」來判斷這個乙個指標函式,還是乙個函式指標。

返回值問題

指標函式的使用和一般函式的使用相同,但需注意返回值問題。對於乙個返回值為指標的函式,不能返回auto型區域性變數的位址,但可返回static型變數的位址。

這是因為auto型變數的生存週期很短,當函式返回時,auto型變數的記憶體空間將被釋放,如果返回值是auto型變數,那麼這個返回指標將無效,變成野指標。而static型別變數占用的記憶體空間則不會因為函式返回而被釋放,不會出現野指標問題。

所以編寫指標函式使要注意返回值。總體原則是:返回的指標對應的記憶體空間不會因函式返回則被釋放掉。常用的返回指標有以下幾種:

(1)      函式中動態分配記憶體空間(通過malloc等實現)的首位址;

(2)      靜態變數(static)或全域性變數所對應的變數的首位址;

(3)      通過指標形參所獲得的實參的有效位址。

函式指標

函式指標就是乙個指向函式的指標。每個函式在編譯時,會被分配乙個入口位址,一般用函式名來表示,這個位址就是該函式的指標。

定義函式指標的定義格式如下:函式型別 (*指標變數) ([引數列表])

在形式上,函式指標的特徵是使用乙個括號包裹指標標誌和指標變數,將括號移除,函式指標就變成指標函式。

之所以容易混淆指標函式和函式指標,是因為指標函式的形式如一般指標變數型別,如:int *x、int *y()、int(*z)()

這裡x和z表示乙個指標,而y則表示乙個函式,所以要注意區分指向變數的指標和指向函式的指標的形式區別。

賦值函式指標的賦值操作:

使用函式名給指向函式的指標變數賦值。其賦值的一般格式如下:函式指標 = [ &] 函式名;

其中,函式名後不能帶括號和引數,函式名前的&是可選,建議不要使用。

呼叫函式指標呼叫格式:函式指標變數([實參列表]); 或 (*函式指標變數)([實參列表]);

推薦第二種用法。這種方法可以很好的表明這是乙個函式。而第一種方法則很容易造成誤導。

之所以容忍一種呼叫方法是因為ansi c 委員會決定容許這種普通函式呼叫句法。這是因為編譯器知道它是乙個指向函式的指標,並且它還知道在該環境下所能做的惟一的一件事就是呼叫函式,因此這裡沒有任何模糊不清的表達

指標與陣列,指標陣列 陣列指標

int a 10 print n a p,a p a,a print n a 1 p,a 1 p a 1,a 1 a做乙個指標,步長為4,指向乙個元素,a做乙個指標,步長為40,指向乙個維陣列 int b 3 4 print n b p,b p,b p b,b,b print n b 1 p,b 1...

指標陣列與陣列指標

1.指標陣列 指標陣列中每乙個元素都是乙個指標,也既是存放字串的首位址。所以指標陣列適合處理若干個長度不等的字串。定義的一般形式為 型別說明符 指標陣列名 陣列長度 例如 int p 3 宣告乙個陣列,指標陣列p,由3個int型別指標變數元素組成 從運算子的優先順序分析,由於 的優先順序大於 所以p...

指標陣列與陣列指標

呵呵,實在是厭倦了繞口的解釋。指標陣列,故名思義,就是指標的陣列,陣列的元素是指標 陣列指標,同樣,就是直想陣列的指標。簡單舉例說明 int p 2 首先宣告了乙個陣列,陣列的元素是int型的指標。int p 2 宣告了乙個指標,指向了乙個有兩個int元素的陣列。其實這兩種寫法主要是因為運算子的優先...