注册 登录
编程论坛 C++教室

求助C++关于指针赋值的问题!

fyz520 发布于 2010-02-02 18:00, 1505 次点击
char *d,char *s;

while(( *d ++ = *s ++ ) != '\0' )
;


这是书上的原语句,意思是把指针s所指字符赋给目标指针d所指的内容,接着将s和d自增1指向了下一个字符,然后判断是否到达了字符串的结尾





我知道d=s的意思是d指向s,也知道*d==*s(假设相等的情况下可以这样写),但 *d ++ = *s ++ 这样的赋值就不太看得懂了,*是取内容运算符,如果*d++取得的值是2,*s++取得的值3,那么就成了2=3(3赋给2)??

大侠帮忙看看哦,



14 回复
#2
gyx88992010-02-02 18:22
发表一下个人观点:
while((*d++=*s++)!='\0')
;
等价于
*(d+1)=*(s+1);//把s的首字符付给d的首字符
while(*(d+1)!='\0')
{
    *s++;
    *d++;
    *d=*s;
}

[ 本帖最后由 gyx8899 于 2010-2-2 22:14 编辑 ]
#3
fyz5202010-02-02 18:37
先谢过了,


*d=*s;//把s的首字符付给d的首字符



这里的*号到底表示什么哦,把s的首字符付给d的首字符应该是d=s啊,为什么还要加*号呢
#4
lintaoyn2010-02-02 19:37
*d++;
++是对d,而不是*d;你认真想下就能明白了
#5
lintaoyn2010-02-02 19:39
++的优先级高于*
#6
gyx88992010-02-02 22:17
回复 3楼 fyz520
d=s;
是传递地址。实际上指:指针d、s指向同一个字符串,即都是第一个字符的地址。
#7
fyz5202010-02-03 09:18
谢谢各位,,,这里的*d=*s,是不是可以理解为引用存储单元的意思呢

比如

int i,j, *d,*s;
    d=&i;
    s=&j;
    *d=*s   // 是不是可以理解为i=j,因为*d就等于i,*s等于j
#8
pangding2010-02-03 23:01
可以这么理解。不过我怎么感觉兜这么大个圈子反而理解着更费劲了?
不过多想想是好事,指针是个比较重要的课题。花些力气是值得的。
#9
fyz5202010-02-04 10:00
恩,想要彻底搞懂指针是件不容易的事哈,
#10
ly8610142010-02-04 12:27
回复 楼主 fyz520
我谈谈我的观点,希望对你有帮助。
我们在描述指针的时候都是说:指向某类型变量的指针。比如:
int ia = 2;
int *pi = &ia;
上面的语句就是指,ia是整型变量,pi是指向整型变量的指针,这个指针指向ia。换句话说就是pi指向了一个存储单元,这个存储单元的地址就是pi的值,该存储单元里存着一个数值2。

有了上面的语句,我们在用*pi时,就是把pi所指向的那个存储单元里的数值拿出来,就像楼主你所说的:*是取内容的。但是,*pi是一个变量,这个变量的值是2,在你的这个例子中,*d  = *s  是指把s所指的变量的值赋给d所指的变量,是用一个变量的值给另一个变量赋值,并不是你所说的把3赋给2。指针是指向变量,而不是指向一个值。

有时候我们也会有这样的疑惑,就是,我们一会说pi指向了ia,一会又说pi指向了一个存储单元,到底哪个说法对呢?其实这两种说法都对,那么我们就很容易想到,存储单元里存储了变量的名字ia。事实上这样想是错误的,存储单元里存的只是这个变量的值,存储单元的地址才相当于名字ia,因为程序经过编译后将变量名转换为了变量的地址。
#11
fyz5202010-02-05 14:56
回复 9楼 fyz520
恩,这样理解很不错,谢谢,,,,,



int i=8;
int *pa=&i;

其实这里的*pa就是变量i的引用,pa指向的是i,*pa==8,实际上是*pa-->i-->8,,,所以*pa实际上可以代替变量i,于是可以赋值,像*pa=*a
#12
zhangting062010-02-09 22:59
楼上   int *pi = &ia;和int *pi = ia;  有什么区别
#13
yikuaidao2010-02-12 13:36
*d也可以访问&s的内容了,不知这么理解对不?
#14
fyz5202010-02-26 10:04
回复 9楼 fyz520
说得很详细,谢谢,一看就知道是个高手,佩服啊,,使我对指针有了一个很好的认识,不得不说指针对新手来说实在太难了
#15
xiaomarn2010-03-01 13:17
++的优先级大于*,所以*s++; 等价于 s++;*s;
即先使指针s加1,让它指向下一个地址,再对此地址取值。
1