當傳遞給函式的是c-
風格字串時,和將陣列傳遞給函式類似。
但傳遞c-
風格字串給函式時,首先是**:
char a[10] = "abcdef";
char *b = a;
函式原型:char abc(char* a,int m); //m是字串長度,非必須
這個時候,將字串傳遞給函式的時候,
引數有三種形式:
①abc(a); //這種方式是將字串作為引數
②abc(b); //這種方式是將指向字串的指標作為引數
③abc("abcdef"); //這種方式是將字串常量作為引數
①和②優點,是可以通過指標或字串(此時字串是位址)作為引數,然後直接修改字串內容。
③的優點,是直接傳遞的常量(注意,這個時候傳遞的不是字串a)。
其中①和②是可以修改的,③是不能修改字串的。假如要禁止字串的修改,那麼在函式原型和函式頭加上const
關鍵字,並相應在其他地方加上
const
關鍵字。
字串作為位址時,實際上是字串第乙個字元的記憶體位址。
如**:
#includeusing namespace std;
char abc(char* a); //函式abc,返回值為char型別
int main()
char abc(char* a)
輸出:
hhhhhh
h請按任意鍵繼續. . .
字串和char
陣列的區別:
字串和char
陣列的最大區別是,字串的最後有結束字元(「
\0」,
ascii值為0
),而不以其為結尾的,則是
char
陣列。
假如不寫完,就容易導致有問題,例如:輸出字串的時候,輸出的是燙(貌似燙是因為亂碼)。
用函式返回字串:
用函式返回字串的方法,是將函式製作為指標函式。
例如函式頭:char *abc(int*m,int n);
這個時候,abc
是函式名,
int*m
是實參傳遞的字串位址,
int n
是字串的寬度。如**:
#includeusing namespace std;
char *hanshu(char*m, const int n);
int main()
char *hanshu(char*m, const int n) //char指標函式
輸出:
mab
mmm請按任意鍵繼續. . .
總結:
①函式可以返回位址(像宣告指標那樣)。
②函式不能在返回位址的時候同時返回字串的長度(但可以通過給字串指定位置賦值'\0'字元)
③也可以在new
字串之後,不能忘記字串的結尾是
\0,否則會出問題。
可以這樣,如**:
char *hanshu(char*m, int n) //char指標函式
函式與字串總結:
①字串的結尾是"\0"
②假如是void 變數名(char*指標, int 字串長度);
傳遞的引數是指標,不能直接通過指標修改字串,只能通過例如:指標名[0]
這樣,逐個修改字元。
如**:
char word[4] = "mab";
hanshu(word);
void hanshu(char*m) //char指標函式
這樣來修改字串。或者使用wihle
或者for
迴圈,迴圈更新使用例如
m++這樣來移動指標。
因為需要逐個修改字元,所以有必要引入字串長度,正如②的第一行那麼寫。在函式內,可以像以上**那樣逐個修改,也可以使用迴圈for
或者while
進行修改。
至於為什麼需要逐個修改字元,不能一次直接修改,不知道……猜測是因為指標型別是char*
,所以不能一次修改。
③假如是有返回值的字串變數,返回值通常為指標位址——非指標位址情況參照(4);
注意,字串應以空字元結尾。
有幾種情況:
(1)在函式內使用
char 變數名
[字串長度
]。
由於字串長度要求是常量,即使函式頭傳遞的引數被const
所限定,也是不能使用的,只能直接輸入數字。所以這個辦法——×
(2)在函式內使用
char *指標名
= new char[
字串長度
]。
這種情況下,字串長度可以為函式頭傳遞的引數,並且,不需要一定使用const
進行限定。如函式頭:char *
指標名(
int 變數名
)這樣的。當然,也可以是char *
指標名(
const int 變數名
)這樣的,這個辦法——√
④函式頭:void
開頭——無返回值;
char *開頭,有返回值,返回值為 指標 或 函式內被
static
限定的字串名;
⑤函式頭傳遞的引數:
通常有(1
)int
型別的字串長度;(2)
char*
型別的指標名/字串名等;
需要函式讀取傳遞的引數(如字元,或者指標),來作為新字串的字元的話,在函式頭使用 指標、字串名、或者字元 作為引數。
如:char *
指標名(
char
變數名, int
字串長度
);
也可以將char 變數名
改為char*指標名
或 char 字串名
等。⑥返回值,有以下幾種情況:
無返回值——函式頭使用void,函式往往是通過傳遞的指標位址來修改字串。
有返回值——函式頭使用char*
字串(
傳遞的引數
),返回值為指標名 或 被static
限定的字串名。通過返回值的位址,來修改字串。
⑦函式本身:
修改原有字串:需要讓指標/字串名作為傳遞的引數,然後逐個修改字串的每個成員。
建立新字串:需要傳遞字串長度(除非預設字串長度為固定值),返回值為指標名(因為函式頭不能為字串名,即
char
字串名[
字串長度](
傳遞的引數
)——應該吧),因此,函式內部也不能把字串名作為返回值(因為函式執行完後,臨時變數會被刪除,而new
指標指向的位址不會被刪除
)。——但是若用static關鍵字 限定
字串名,則可以用字串名作為新字串的返回值。如**:
#includeusing namespace std;
char *abc(int);
int main()
char *abc(int m)
輸出:
aaa
請按任意鍵繼續. . .
C風格字串與C 風格字串
c風格字串 對字串進行操作的 c 函式定義在標頭檔案中 1.字串定義 char result 2.字串的最後乙個字元是null字元 0 可以通過這個字元確定字串的結尾。3.strlen 返回的是字串的大小 因此,分配空間的時候,需要比字串的實際空間大1.e.g.char copystring con...
C風格字串與C 風格字串
c風格字串 對字串進行操作的 c 函式定義在標頭檔案中 1.字串定義 char result 2.字串的最後乙個字元是null字元 0 可以通過這個字元確定字串的結尾。3.strlen 返回的是字串的大小 因此,分配空間的時候,需要比字串的實際空間大1.e.g.char copystring con...
c風格字串與c風格字串陣列
include includeusing namespace std int main 輸出結果 0034ff10 0034ff10 0034ff04 013bdc80 char str abcd 先在文字常量區為 abcd 常量分配5b,接著在棧裡為指標str分配4b,並接收 abcd 字串的首位...