指標與字串
一、陣列存放字元
c語言中沒有特定的字串型別,我們通常是將字串放在乙個字元陣列中,(例1_1)字元陣列歸根結底還是乙個陣列,上節講到的關於指標和陣列的規則同樣也適用於字元陣列(例1_2)。
二、字元指標
除了字元陣列,
c語言還支援另外一種表示字串的方法,就是直接使用乙個指標指向字串, 例如
:char *str = "hello"; 或者:
char *str;str = "hello";
字串中的所有字元在記憶體中是連續排列的,str指向的是字串的第0個字元;我們通常將第0個字元的位址稱為字串的首位址。字串中每個字元的型別都是
char
,所以str
的型別也必須是
char *
。(例2)
三、兩類存放字元的區別
它們最根本的區別是在記憶體中的儲存區域不一樣,字元陣列儲存在全域性資料區或棧區,第二種形式的字串儲存在常量區。全域性資料區和棧區的字串(也包括其他資料)有讀取和寫入的許可權,而常量區的字串(也包括其他資料)只有讀取許可權,沒有寫入許可權。記憶體許可權的不同導致的乙個明顯結果就是,字元陣列在定義後可以讀取和修改每個字元,而對於第二種形式的字串,一旦被定義後就只能讀取不能修改,任何對它的賦值都是錯誤的。另外,字元陣列的sieof(str)為陣列中元素個數(包括『\0』),字元指標的sizeof(str)為指標大小。(例3)
四、何種情況使用字元陣列還是字串常量
在程式設計過程中如果只涉及到對字串的讀取,那麼字元陣列和字串常量都能夠滿足要求;如果有寫入(修改)操作,只能使用字元陣列,不能使用字串常量。(例4)
指標與函式
為什麼用指標或陣列名作為函式的引數
1、使用由於函式最多有乙個返回值,為了得到
更多的函式返回值
,用指標變數作函式引數可以將函式外部的位址傳遞到函式內部,使得在函式內部可以操作函式外部的資料,並且這些資料不會隨著函式的結束而被銷毀。因此可以得到多個函式的返回值。(例1_1、例1_2、例1_3)
(任務:編寫mystrlen,mystrcmp,mystrcat,mystrcpy) 2
、像陣列、字串、動態分配的記憶體等都是一系列
資料的集合
,沒有辦法通過乙個引數全部傳入函式內部
,只能傳遞它們的指標,在函式內部通過指標來影響這些資料集合。
注意:1)將陣列作為函式引數時會被弱化成指標,因此傳遞到函式內部的都是陣列指標(位址),所以在函式內部無法通過這個指標獲得陣列長度,必須將陣列長度作為函式引數傳遞到函式內部。(例2用陣列作函式引數) 2)
int max(intarr[6], int len);
或者int max(intarr, int len);
c語言為什麼不允許直接傳遞陣列的所有元素,而必須傳遞陣列指標呢?
引數的傳遞本質上是一次賦值的過程,賦值就是對記憶體進行拷貝。所謂記憶體拷貝,是指將一塊記憶體上的資料複製到另一塊記憶體上。
這樣會嚴重拖慢程式的效率,因此
c語言沒有從語法上支援資料集合的直接賦值。 c
語言允許函式的返回值是乙個指標(位址),我們將這樣的函式稱為指標函式。
(例1返回兩個字串中較長的乙個)
注意:1、用指標作為函式返回值時需要注意的一點是,函式執行結束後會銷毀在它內部定義的所有區域性資料,包括區域性變數、區域性陣列和形式引數,函式返回的指標請盡量不要指向這些資料,
c語言沒有任何機制來保證這些資料會一直有效,它們在後續使用過程中可能會引發執行時錯誤。(例2_1) 2
、這裡所謂的銷毀並不是將區域性資料所占用的記憶體全部抹掉,而是程式放棄對它的使用許可權,棄之不理,後面的**可以隨意使用這塊記憶體。(例2_2)
乙個函式總是占用一段連續的記憶體區域,函式名在表示式中有時也會被轉換為該函式所在記憶體區域的首位址,這和陣列名非常類似。我們可以把函式的這個首位址(或稱
入口位址
)賦予乙個指標變數,使指標變數指向函式所在的記憶體區域,然後通過指標變數就可以找到並呼叫該函式。這種指標就是函式指標。
函式指標的定義形式為:
returntype (*pointername)(param list);
returntype
為函式返回值型別
,pointernmae
為指標名稱
,param list
為函式引數列表。引數列表中可以同時給出引數的型別和名稱,也可以只給出引數的型別,省略引數的名稱,這一點和函式原型非常類似。注意,
( )的優先順序高於
*,第乙個括號不能省略。
(例1)
3 25指標與字串
建立與輸出 char str 10 hellow cout str 建立乙個指向字串的指標 c 11並不建議這樣使用 char p str 10 hellow cout p str 系統會認為這是乙個指向字元常量的字串指標,這種不允許修改的 一般使用 char p str 建立乙個char型別的指向...
34 指標與字串
1 字串指標 在c語言中,可以用兩種方法訪問乙個字串 1 字元陣列 char string i love china printf s n string 說明 和前面介紹的陣列屬性一樣,string是陣列名,它代表字元陣列的首位址。2 字串指標指向字串 char 變數名 字串內容 對指向字元變數的指...
9 指標與字串2
void swap int pa,int pb 陣列變數是特殊的指標。但是陣列的單元表達的是變數,需用 取位址 a a 0 運算子可以對陣列做,也可以對指標做 運算子可以對指標做,也可以對陣列做 陣列變數是const的指標,所以不能被賦值 指標是const 所指是const int i const ...