嵌入式 Linux C語言(五)――指針與字符串
一、字符串簡介
1、字符串聲明
聲明字符串的方式有三種:字面量、字符數組、字符指針。字符串字面量是用雙引號引起來的字符序列,常用來進行初始化,位於字符串字面量池中,字符字面量是用單引號引起來的字符。字符串字面量池是程序分配的一塊內存區域,用來保存組成字符串的字符序列。多次用到一個字符串字面量時,字符串字面量池中通常只保存一份副本,一般來說字符串字面量分配在只讀內存中,是不可變的,但是當把編譯器有關字面量池的選項關閉時,字符串字面量可能生成多個副本,每個副本擁有自己的地址。 GCC編譯器中字符串字面量是可以改變的,為了將字符串指針變量聲明為常量可以用const修飾。
字符串是以ASCII字符NUL結尾的字符序列。字符串通常存儲在數組或者從堆上分配的內存中。並非所有的字符數組都是字符串,字符數組可能沒有NUL字符。字符串的長度是字符串中除了NUL字符之外的字符數。字符常量是單引號引起來的字符序列,通常由一個字符組成。字符的長度是1個字節,字符字面量的長度是4個字節。sizeof(char)= 1,sizeof(‘a’) = 4。字符數組是一個數組,每個元素的值都可以改變。而字符串指針指向的是一個常量字符串,它被存放在程序的靜態數據區,一旦定義就不能改變。這是最重要的區別。
2、字符串初始化
初始化字符串采用的方法取決於變量是被聲明位字符數組還是字符指針,為字符串分配的內存要麼是數組要麼是指針指向的一塊內存。初始化字符數組:char buffer[] = “hello world”;//字符串的長度為11,字面量需要12個字節char buffer[12];strcpy(buffer, “hello world”);初始化字符指針:char *buffer = (char *)malloc(strlen(“hello world”) + 1);strcpy(buffer, “hello world”);
二、傳遞字符串
函數中經常將參數聲明為字符指針。
1、傳遞簡單字符串
直接傳遞字符串字面量:
char buffer[12];strcpy(buffer, “hello world”);傳遞字符數組:char src[] = “hello world”;//字符串的長度為11,字面量需要12個字節char dest[12];strcpy(dest, src); 為了避免傳入的字符串被修改,可以將傳遞的形參聲明為const。const char src[] = “hello world”;//字符串的長度為11,字面量需要12個字節char dest[12];strcpy(dest, src);//char *strcpy(char *dest, const char *src);
2、傳遞需要初始化的字符串
函數返回需要函數初始化的字符串,因此需要向函數傳遞緩沖區。A、必須傳遞緩沖區的地址和長度
B、調用者負責釋放緩沖區
C、函數通常返回緩沖區的指針
char pfun(char *buffer, int size)
{
xxxxx;return buffer;}
3、給應用程序傳遞參數
int main(int argc, char **argv){}
通過應用程序的入口函數main可以像應用程序傳遞參數
三、返回字符串
函數返回字符串時返回的實際是字符串的地址,返回的地址必須是合法的。
1、返回字面量的地址
Char *returnstring(int code)
{
xxx;return “hello world”; }
2、返回動態分配內存的地址
在函數內從堆上動態分配字符串的內存,返回地址。char *blanks(int num){char *buffer = (char *)malloc(num + 1); strcpy(buffer, “hello world”);xxx;retrurn buffer;}使用完成後,函數調用者必須釋放內存,否則會造成內存洩漏。
3、返回局部字符串的地址
返回局部字符串的地址是不可取的,局部字符串所在的內存會被其他棧幀覆蓋。char *blanks(void)
{
char buffer[] = "hello world";
return buffer;
}
本文出自 “生命不息,奮斗不止” 博客,請務必保留此出處http://9291927.blog.51cto.com/9281927/1790159