【C字符指针做函数参数】示例代码及指针技巧

207 阅读1分钟

1.示例代码

/*    例8.13 复制字符串   */
#include<stdio.h>
int main(){
    void copyString(char *from,char *to);
​
    char *a = "I am a teacher.";
    char b[] = "You are a student.";
    char *p = b;
​
    copyString(a,p);
​
    printf("a is:%s\n",a);
    printf("b is:%s\n",p);
    return 0;
}
​
void copyString(char *from,char *to){
    for(;*from != '\0';from++,to++){
        *to = *from;
    }
    *to = '\0';
}

2.指针使用技巧

方式①
void copyString(char *from,char *to){
    while((*to=*from) != '\0'){
        to++;
        from++;
    }
}
说明

将*to = *from放在while的表达式中,而且把赋值运算和判断是否为'\0'的运算放在一个表达式中,先赋值,后判断

在循环中使to和from增值,指向下一个元素,直到*from的值为'\0'为止。

方式②
void copyString(char *from,char *to){
    while((*to++ = *from++) != '\0');
}
说明

将前面的to++和from++运算与to = from合并,先将from赋值给to,然后使to和from增值。

方式③
void copyString(char *from,char *to){
    while(*from != '\0'){
        *to++ = *from++;
    }
}
说明

from不等于'\0'时,将from赋值给*to,然后使to和from增值。

方式④
void copyString(char *from,char *to){
    while(*from){
        *to++ = *from++;
    }
    *to = '\0';
}
说明

字符可以用ASCII码代替,由于'\0'的ASCII码为0,因此可以用from != 0代替from != '\0',而from != 0可以继续简化为from(因为from的值不等于0,则表达式from为真,同时*from != 0也为真。)。

因此 while(*from != 0)等价于while(*from)。

方式⑤
// 该方式等价于方式②
void copyString(char *from,char *to){
    while(*to++ = *from++);
}
说明

from赋值给to,如果赋值后to的值等于'\0',循环终止('\0'已赋值给to)。

方式⑥
void copyString(char *from,char *to){
    for(;(*to++ = *from++) != 0);
    // 或
    for(;*to++ = *from++;);
}
方式⑦
void copyString(char from[],char to[]){
    char *p1,*p2;
    p1 = from,p2 = to;
    while((*p2++=*p1++) != '\0');
}
说明

用字符数组名做函数参数,在函数中另定义两个指针变量。