字串可以分配在記憶體的不同區域,通常用指標來支援字串操作,指標支援動態分配字串和將字串作為引數傳遞給函式。知道字串的位置對理解程式的工作原理以及用指標訪問字串有幫助。字串的位置決定它能存多久,以及程式的哪些部分可以訪問它。比如說,分配在全域性記憶體的額字串會一直存在,可以被多個函式訪問。靜態區域性字串也一直存在,不過只有定義他們的函式才能訪問,分配在堆上的內存在釋放之前會一直存在,也可以被多個函式訪問。
字串通常以字元指標的形式傳遞給函式和從函式返回,可以用字元指標傳遞給字串,也可以用字元常量的指標傳遞字串,後者可以避免字串被函式修改。
1.字串初始化
字串是以ascii字元'\0'結尾的字串行,通常儲存在陣列或者從堆上分配的記憶體中宣告字串方式有三種:字面量、字元陣列及字元指標。
字面量是用雙引號括起來的字串行,常用來初始化字串陣列操作。
char* string = "hello";
char str = "this is a string";
初始化char指標
常使用malloc和strcpy函式來分配記憶體並將字面量複製到字串。在使用malloc分配字串長度時候,一定要記得算上終止符'\0', 同時不要用sizeof操作符,而是用strlen函式確定字串長度,sizeof返回陣列和指標的長度,而不是字串的長度。
char* header = (char*)malloc(strlen("media player") + 1);
strcpy(header, "media player");
2.傳遞字串
傳遞字串很簡單,用char*指標型別作為函式形參即可,如果不允許函式內部改變字串,可以用const char*傳遞引數。
size_t stringlen(char* string)size_t length = 0;
while(*string++)
return length;
字串常量指標形式傳遞字串指標,可以防止傳遞的字串被修改,如下面例子,試圖修改原字串,就會產生乙個編譯錯誤傳遞需要初始化的字串size_t stringlen(char* string)
...*string = 'a';
...
有些情況下讓函式返回乙個由該函式初始化的字串,需要傳輸乙個緩衝區,通常需要傳遞緩衝區的位址和長度,呼叫者負責釋放緩衝區,函式通常返回緩衝區的指標。這種方法把分配和釋放緩衝區的責任都交給了呼叫者。
char* format(char* buffer,size_t size, const char* name)3.返回字串snprintf(buffer,size, "item:%s", name);
return buffer;
函式返回字串時,返回的實際是字串的位址。實際一般可以返回字串字面量和動態分配的記憶體,不能返回區域性字串陣列的位址。
char * returnaliteral(int code)上面的函式返回陣列的位址,每次呼叫函式後,位址所在的記憶體區域都會被覆蓋,解引用指標後,該記憶體位址的內容已經改變。switch(code)
spaces[number] = '\0';
return spaces;
總結:講解了字串操作和指標的使用,字串的結構和在記憶體中的位置會影響其使用。
C語言指標 字串和指標
字元指標可以指向字元變數,但在實際應用中,我們常常會用到字串,而字串也是可以用字元指標指向的,但根據字串的不同儲存方式主要分為字串常量和利用字元陣列儲存的字串變數,兩者有不同的定義和使用形式 字元指標可以用來儲存字串常量的首位址 例如 char ptr my name is 此時,字串常量在記憶體中...
C語言 字串 指標
字串 1.字串 jack j a c k 0 用陣列儲存字串 char name 10 jack printf name 2.字串的一些定義 都是字串 0的ascii碼值是0 char name 8 it char name2 8 char name3 8 0的ask碼是0 char name4 8...
C語言指標和字串練習
題目描述 使用自定義函式void sort int a,int n 對陣列a中的整數進行排序 公升序 函式的引數 a為陣列 指標 n為陣列中元素的個數。裁判程式如下 一組整數 不超過10個 每個整數的絕對值不超過1000,讀取到輸入結束 按公升序輸出,每行乙個 3 1 4 1 5 911 3459 ...