|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
代码如下,很简单的字符传拷贝函数,结果都能正常输出,我不理解的地方有两个:
一是在函数mycp1中,通过指针运算为指针a赋值,*a++导致指针已发生变化,为何调用mycp1后str2结果从头输出完整字符拷贝结果?
二是在函数mycp2被调用后,返回值没有接收者,str3为何也能获得拷贝后的结果?
请前辈解惑,万分感谢!
- #include <stdio.h>
- #include <stdlib.h>
- #define N 128
- void mycp1(char* a, const char* b) {
- if(a != NULL && b != NULL)
- while((*a++ = *b++) != '\0');
- }
- char* mycp2(char *a, const char* b) {
- char* ret = a;
- if(a != NULL && b != NULL)
- while((*a++ = *b++) != '\0');
- return ret;
- }
- int main() {
- char str1[] = "test demo line!";
- char str2[N], str3[N];
- mycp1(str2, str1);
- puts(str2);
- mycp2(str3, str1);
- puts(str3);
- exit(0);
- }
复制代码
本帖最后由 桃花飞舞 于 2022-11-19 00:46 编辑
你对指针,数组名 还是没理解对。
代码如下,很简单的字符传拷贝函数,结果都能正常输出,我不理解的地方有两个:
一是在函数mycp1中,通过指针运算为指针a赋值,*a++导致指针已发生变化,为何调用mycp1后str2结果从头输出完整字符拷贝结果?
- mycp1(str2, str1); //传进来的是str2 也就是说a一开始指向的是str2的数组的首元素的首地址
- void mycp1(char* a, const char* b) { //*a++ char* a 是指针变量,a是指针变量也是变量是变量就可以改变它的值
- if(a != NULL && b != NULL) //这一句是排除空指针的情况
- while((*a++ = *b++) != '\0'); //这一句执行完之后也就把str1中的数据完全放到str2中了
- }
- puts(str2); //这一句的str2是指数组的首元素的首地址当然可以从头输出在字符串
复制代码
二是在函数mycp2被调用后,返回值没有接收者,str3为何也能获得拷贝后的结果?
- mycp2(str3, str1); //a指向的是str3的首元素的首地址
- char* mycp2(char *a, const char* b) {
- char* ret = a; //指针变量ret指向的是str3的首元素的首地址
- if(a != NULL && b != NULL)
- while((*a++ = *b++) != '\0');
- return ret; //问你个问题,ret这时候指向的是 哪里?是不是str3首元素的首地址?
- }
-
- puts(str3); //这句中的str3 常量指针的值的是不是和 数组首元素的首地址一样呢? 当然一样了
复制代码
你要知道数组名是什么?数组名第一个是作为数组变量表示数组的一整个空间,第二个就是当做指针可以表示数组的首元素地址
|
|