字符串常量实际上是个字符数组,比如 welcome to www.nowamagic.net 就是个字符数组,并且以 '\0' 结尾。
字符串串常量的一个常见的用法就是作为函数参数,比如常见的 printf("welcome to www.nowamagic.net"); 字符串参数实际上是通过字符指针访问该字符串的。这里的 printf() 函数接受的是一个指向字符数组第一个字符的指针。字符串常量是可以通过指向其第一个元素的指针来访问的。
下面程序中的函数 stringcopy(char *source, char *target) 实现的功能是,把指针 target 指向的字符串复制到指针 source 指向的位置。
#include
void stringcopy(char *source, char *target);
int main()
{
char str_a[] = "Welcome to www.nowamagic.net";
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.nowamagic.net
str_b为
调用函数后
str_a为 o www.nowamagic.net
str_b为 Welcome to www.nowamagic.net
因为参数是通过值传递的,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语言程序经常采用这种写法。