| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1250 人关注过本帖
标题:正在学习指针部分,碰到一处关于指针自增的问题,求解答
只看楼主 加入收藏
韩三明
Rank: 1
等 级:新手上路
帖 子:11
专家分:5
注 册:2011-8-30
收藏
 问题点数:0 回复次数:12 
正在学习指针部分,碰到一处关于指针自增的问题,求解答
程序代码:
#include <stdio.h>

void mystrcpy(char *to, char *from);

int main(void)
{
  char str[80];

  mystrcpy(str, "helloword");
  printf(str);

  return 0;
}

void mystrcpy(char *to, char *from)
{
  while(*from) *to++ = *from++; //这里,*to++和*from++代表下一个文字符,那么第一个文字符的带入怎么办?
    *to = '\0';

}

求解答~谢谢
搜索更多相关主题的帖子: 学习 
2011-11-27 22:34
零波丽
Rank: 3Rank: 3
来 自:莉莉斯
等 级:论坛游侠
帖 子:222
专家分:107
注 册:2011-9-8
收藏
得分:0 
循环外面写生 第一个的 相等
理解?

~void mystrcpy(char *to, char *from)
{
   *to = *from
  while(*from) *to++ = *from++; //这里,*to++和*from++代表下一个文字符,那么第一个文字符的带入怎么办?
    *to = '\0';

}

人又是什么?神造出来的东西。 人是人造出来的东西。
2011-11-27 23:18
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
回复 楼主 韩三明
while循环还可以这么写
while(*to++ = *from++)
        ;
请楼主翻开书看看关于运算符"++"的解释

[ 本帖最后由 embed_xuel 于 2011-11-27 23:25 编辑 ]

总有那身价贱的人给作业贴回复完整的代码
2011-11-27 23:23
韩三明
Rank: 1
等 级:新手上路
帖 子:11
专家分:5
注 册:2011-8-30
收藏
得分:0 
回复 2楼 零波丽
不是很明白。。
这个是书上的例,while外面没有 *to=*from; 这一步,而结果是正确的。。
你的意思是  *to=*from; 是默认了的所以可以省略?
2011-11-28 00:24
韩三明
Rank: 1
等 级:新手上路
帖 子:11
专家分:5
注 册:2011-8-30
收藏
得分:0 
回复 3楼 embed_xuel
a++ : 先输出a,然后自增
++a : 先自增,然后输出

但是书上说,*t++  则正好相反,自增之后在*. 等价于 *(t++);

所以不是很明白。。那道例题里from[0]所指向的文字符怎么代入?
2011-11-28 00:30
luchar
Rank: 9Rank: 9Rank: 9
来 自:南京
等 级:蜘蛛侠
帖 子:279
专家分:1263
注 册:2011-11-3
收藏
得分:0 
回复 5楼 韩三明
不是吧,他说的相反是指结合方向相反;
在++a和a++里,是从左方开始结合的,就是先看左边的操作,
所以才会有++a的时候是先++,然后才得到值。
a++的时候,是先取a的值,再++;
==============================
而这里的是*和a++结合的问题,是右结合,就如下:
你看啊,*a++等价于*(a++),这里你可以把*和(a++)分开来看;
就是先算*右边的值,再和*结合起来。
=============================
(a++)这个的值是多少啊?
不就是a么,然后和*结合,形成*a,然后a自增。明白了?
2011-11-28 01:11
strivelong87
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:68
专家分:159
注 册:2011-11-24
收藏
得分:0 
把指针运算符*,自增运算符++和圆括号与一个指针变量p搭配,可以都得到以下运算组合:(假定之前有p=&a;)
1、*p++
2、*p(++)
3、(*p)++
4、*++p
5、*(++p)
6、++*p
7、++(*p)

分析结果:
1、*p++,p先跟*结合了,得到p指向的变量的值,即(*p),然后p再跟++结合,使指针p指向内存中下一个位置。结果改变不能立即看出。
2、*p(++),虽然有优先级更高的圆括号()把++括起来,但就算要先计算括号里面的东西,光有一个++,什么也做不了。没办法,只能让p先跟*结合,再跟++结合。这就跟第1种组合一样。
3、(*p)++,由于优先级,圆括号里面的先计算,所以先取*p,再使(*p)自增1,而不是使指针p指向内存中下一个位置。结果改变不能立即看出。
4、*++p,由于结合性,这种写法体现了++和*自右向左的结合方向,先使指针p指向内存中下一个位置,再取*p。结果改变可以立即看出。
5、*(++p),同第4种组合。
6、++*p,由于结合性,这种写法体现了++和*自右向左的结合方向,先使*p自增1,再取*p。结果改变可以立即看出。
7、++(*p),同第6种组合。

总结一下:
*p++等价于*p(++),取值,移位(不安全)。
(*p)++,取值,增值。
*++p等价于*(++p),移位,取值(不安全)。
++*p等价于++(*p),增值,取值。
2011-11-28 09:58
韩三明
Rank: 1
等 级:新手上路
帖 子:11
专家分:5
注 册:2011-8-30
收藏
得分:0 
回复 6楼 luchar
明白了。
*之后(p++),对于(P++)则先P再++。。懂了懂了。
谢谢~
2011-11-28 10:10
strivelong87
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:68
专家分:159
注 册:2011-11-24
收藏
得分:0 
后缀++的优先级比*递引用运算符的优先级高,所以*p++的结合顺序应该是*(p++),根据上面后缀++的语义很容易得到*p++就相当于tmp=p,   p=p+1,   *tmp
2011-11-28 10:13
韩三明
Rank: 1
等 级:新手上路
帖 子:11
专家分:5
注 册:2011-8-30
收藏
得分:0 
回复 7楼 strivelong87
自右向左结合!懂了,记住了。
谢谢~~~
2011-11-28 10:13
快速回复:正在学习指针部分,碰到一处关于指针自增的问题,求解答
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.046704 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved