字符串常量實際上是個字符數組,比如 welcome to www.bkjia.com 就是個字符數組,並且以 '\0' 結尾。
字符串串常量的一個常見的用法就是作為函數參數,比如常見的 printf("welcome to www.bkjia.com"); 字符串參數實際上是通過字符指針訪問該字符串的。這裡的 printf() 函數接受的是一個指向字符數組第一個字符的指針。字符串常量是可以通過指向其第一個元素的指針來訪問的。
下面程序中的函數 stringcopy(char *source, char *target) 實現的功能是,把指針 target 指向的字符串復制到指針 source 指向的位置。
#include <stdio.h> void stringcopy(char *source, char *target); int main() { char str_a[] = "Welcome to www.bkjia.com"; char str_b[] = ""; int wait; printf("str_a為 %s \n", str_a); printf("str_b為 %s \n", str_b); stringcopy(str_b, str_a); printf("調用函數後 \n"); printf("str_a為 %s \n", str_a); printf("str_b為 %s \n", str_b); scanf("%d", &wait); } void stringcopy(char *source, char *target) { int i; i = 0; while((source[i] = target[i]) != '\0') i++; }
程序運行結果:
str_a為 Welcome to www.bkjia.com str_b為 調用函數後 str_a為 o www.bkjia.com str_b為 Welcome to www.bkjia.com
因為參數是通過值傳遞的,source 和 target 在循環中每執行一次,它們就沿著相應的數組前進一個字符,直到將 targrt 中的結束符 '\0' 復制到 source 為止。
經驗豐富的程序員則喜歡像下面那樣寫:
void stringcopy(char *source, char *target) { while((*source++ = *target++) != '\0') ; }
在這個函數中,source 和 target 的自增運算放到了循環的測試部分。
可以進一步精煉程序,表達式同 '\0' 的比較是多余的,只需要判斷表達式的值是否為0即可。
void stringcopy(char *source, char *target) { while(*source++ = *target++) ; }
這樣的寫法看起來不容易理解,但這種寫法是有其好處,C語言程序經常采用這種寫法。