老牛来学习 发表于 2020-4-7 21:05:45

C语言

下列程序中的函数strcpy2()是新啊字符串两次赋值,即将t所指字符串复制两次到s所指内存空间中,合并形成一个新字符串。例如:若t所指字符串为“efgh”,调用strcpy2后,s所指字符串为“efghefgh”。

#include<stdio.h>
void strcpy2(char *s,char *t)
{
        char *p = t;
        while(*s++ = *t++);                //这段代码是不是相当于把t的值赋给s?
        s = s-1;                        //这段是干什么用的,s是一个字符指针的首地址,相当于s【0】;那这句话的意思是s【0】=s【0-1】??
        while(*s++ = *p++);
}
int main(void)
{
        char str1 = "abcd",str[] = "efgh";
        strcpy2(str1,str2);
        printf("%s\n",str1);
        return 0;
}

ba21 发表于 2020-4-7 21:06:48

s = s-1;       s 是地址。s-1就是地址-1

老牛来学习 发表于 2020-4-7 21:17:59

ba21 发表于 2020-4-7 21:06
s = s-1;       s 是地址。s-1就是地址-1

啥意思,它已经是0了,再减一不就变-1了?

BngThea 发表于 2020-4-7 21:18:33

while(*s++ = *t++);                //这段代码是不是相当于把t的值赋给s?


s = s-1;                        //这段是干什么用的,s是一个字符指针的首地址,相当于s【0】;那这句话的意思是s【0】=s【0-1】??
这里是因为上一段过程中s指针已经移动到了数组的末尾,将他减去1可以将指针重新移动到数组的开头,这样下面的代码就可以再复制一份

ba21 发表于 2020-4-7 22:16:57

本帖最后由 ba21 于 2020-4-7 22:18 编辑

老牛来学习 发表于 2020-4-7 21:17
啥意思,它已经是0了,再减一不就变-1了?

s = s-1 是地址-1 没有任何问题,就是地址-1
BngThea 的解释为什么你能理解。这点我是不懂的。反正他的解释我理解不来。
这里是因为上一段过程中s指针已经移动到了数组的末尾,将他减去1可以将指针重新移动到数组的开头
-1 能将指针移到数组开头吗????? 地址-1就是前移1位这是绝对的

printf("%d\n", sizeof(str2)); // ==== 5
所以:

老牛来学习 发表于 2020-4-8 17:41:39

ba21 发表于 2020-4-7 22:16
s = s-1 是地址-1 没有任何问题,就是地址-1
BngThea 的解释为什么你能理解。这点我是不懂的。反正他 ...

感谢大佬,昨天其实看到他的答案之后,自己就想到了,不过看了大佬的答案,理解更深了,感谢
页: [1]
查看完整版本: C语言