C字串(一)
阿新 • • 發佈:2018-12-12
#include <stdio.h> #include "../include/c_string.h" #define UNUSED 0 int main() { sizeofAndStrlen(); testspc(); strArrOrPtr(); initStr(); return 0; } void sizeofAndStrlen() { char str[] = "Hello Mike!"; printf("sizeof = %d\n",sizeof(str)); //sizeof()計算型別的長度,即char[]型別的長度,包括空字元'\0' printf("strlen = %d\n",strlen(str)); // strlen()計算實際字串的長度,不包括空字元'\0' } void testspc() { printf("%s,%p,%c\n","We","are",*"family"); // 第三個的解釋如下程式所示 char *p = "family"; printf("%p\n",p); // 首地址 printf("%c",*p); // 首地址上的值 } void initStr() { char s1[] = "You are good"; // 字串 char s2[] = {'Y','o','u',' ','a','r','e',' ','g','o','o','d','\0'}; // 字串、字元陣列 char s3[] = {'Y','o','u',' ','a','r','e',' ','g','o','o','d'}; // 字元陣列 printf("s1 = %s\n",s1); printf("s2 = %s\n",s2); printf("s3 = %s\n",s3); //???????????????? You are goodYou are good } void strArrOrPtr() { /* * 字串常量屬於靜態儲存類別,只會被儲存一次,在整個程式的生命週期記憶體在; */ char sa[] = "I am good"; /* * 陣列形式 * 陣列名sa是常量,不能更改; * 程式執行時,記憶體為陣列分配arr_size大小的空間,將字串拷貝到陣列中; * 此時,字串有兩個副本,一個在靜態記憶體中,一個在陣列中; */ const char* sp = "I am good"; /* * 指標形式 * 指標sp是變數,可用遞增運算子++、--; * 程式執行時,記憶體為指標變數分配一個空間,將字串的地址儲存於此; * 此時,字串只有一個副本,即在靜態記憶體中; */ printf("address of sa: %p\n",sa); // sa不同,表明是新開闢的陣列記憶體,與靜態記憶體地址不同 printf("address of sp: %p\n",sp); printf("address of \"I am good\": %p\n","I am good"); // sp和"I am good"地址相同,表明指標指向靜態記憶體中字串常量所在位置 /* * 指標和陣列相同操作:陣列訪問、指標訪問 */ printf("%d, %d\n",sa[1],sp[1]); printf("%d, %d\n",*(sa+1),*(sp+1)); /* * 不改變字串的內容,建議使用const修飾符指標 * 改變字串的內容,建議使用陣列 */ /* * 區分幾個概念: * 指標的地址 * 指標的值 * 指標指向的資料 * 指標指向的資料的地址,即指標的值 */ #ifdef UNUSED //sp[0] = 'p'; printf("address of sp: %p\n",sp); //竟然無法輸出!!! #endif }