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

c++指针问题

风雨123 发布于 2013-03-06 10:50, 927 次点击
#include <iostream>
using namespace std;
void prt(int*x,int *y,int *z)
{   
    cout<<++*x<<","<<++*y<<","<<*(z++)<<endl;
   
}
int a=10,b=40,c=20;
void main()
{
    prt(&a,&b,&c);
    prt(&a,&b,&c);
}
结果为 11,41,20;  
       12,42,20;
为什么*(z++)的值不变???为什么20;求各位帮忙。
20 回复
#2
wp2319572013-03-06 10:52
又是前++  后++的经典问题哈
#3
Pirelo2013-03-06 11:10
问题就出在表达式*(z++):
第一次调用prt(&a,&b,&c);传的是a,b,c地址的拷贝,
cout<<++*x;和cout<<++*y;实际是对变量a和b进行操作,相当于++a,和++b,因此a和b的输出结果各自增加1不难理解。
但cout<<*(z++),是对c的地址进行后自增,等价于cout<<*z;z=z+1;,因此输出的还是c的值,然后对c地址的拷贝自增一次,实际上对c的值以及c的地址都没有任何影响;

因此当第二次调用prt()时,a和b的值照旧自增一次,c依然是原来那个c,c的地址也没有任何改变!
#4
邓士林2013-03-06 11:24
以下是引用Pirelo在2013-3-6 11:10:14的发言:

问题就出在表达式*(z++):
第一次调用prt(&a,&b,&c);传的是a,b,c地址的拷贝,
cout<<++*x;和cout<<++*y;实际是对变量a和b进行操作,相当于++a,和++b,因此a和b的输出结果各自增加1不难理解。
但cout<<*(z++),是对c的地址进行后自增,等价于cout<<*z;z=z+1;,因此输出的还是c的值,然后对c地址的拷贝自增一次,实际上对c的值以及c的地址都没有任何影响;
 
因此当第二次调用prt()时,a和b的值照旧自增一次,c依然是原来那个c,c的地址也没有任何改变!
不错,好好品味
#5
yuccn2013-03-06 12:02
这种问题,考试倒是很喜欢用,一般工作上没有谁会写的那么蛋疼

最多就是一行单独的 i++ 的
#6
qq3725058552013-03-06 20:40
回复 3楼 Pirelo
*(z++)
z还是指向变量c?而且输出c的值?z不是自加了吗?求解释
#7
Pirelo2013-03-08 09:57
回复 6楼 qq372505855
在每次调用prt()时,指针z确实指向c,因此输出了c的值,而后指针z也自增1,但是有两点需要搞明白:
1> 指针z自增1后,请问它指向什么地方?反正不再指向c了,对吧?
2> 指针z只是函数prt()内部的局部变量,当调用prt()时,仅仅是把c的地址拷贝一份复制给了指针z:z = &c,当每次调用结束后,无论指针z指向谁,作为局部变量的它都会在函数调用结束时消失,因此无论多少次调用prt(&a,&b,&c);但每次输出的必定是c原来的值
#8
小菜B2013-03-08 11:30
不知道跟不跟静态变量有没有关系
#9
qq3725058552013-03-10 13:56
回复 7楼 Pirelo
*(z++)
这里难道不是z自加以后显示值吗?为什么会变成显示值后再自加呢?
#10
锋了2013-03-10 14:13
围观。。。
#11
好聚好散2013-03-10 16:06
#include <iostream>
using namespace std;
void prt(int*x,int *y,int *z)
{   
    cout<<++*x<<","<<++*y<<","<<*(z++)<<endl;
    cout << &z<<endl;
   
   
}
int a=10,b=40,c=20;
void main()
{
    prt(&a,&b,&c);
    cout<<&c<<endl;
    prt(&a,&b,&c);
   cout << &c<<endl;
   
}

11,41,20
0012FEF8
00477DC8
12,42,20
0012FEF8
00477DC8
请六楼解释下Z的地址为什么也没变呢??
#12
好聚好散2013-03-10 16:07
#include <iostream>
using namespace std;
void prt(int*x,int *y,int *z)
{   
    cout<<++*x<<","<<++*y<<","<<*(z++)<<endl;
    cout << &z<<endl;
   
   
}
int a=10,b=40,c=20;
void main()
{
    prt(&a,&b,&c);
    cout<<&c<<endl;
    prt(&a,&b,&c);
   cout << &c<<endl;
   
}

11,41,20
0012FEF8
00477DC8
12,42,20
0012FEF8
00477DC8
请六楼解释下Z的地址为什么也没变呢??
#13
qunxingw2013-03-11 09:38
对比一下*(++Z)测试下
#14
Pirelo2013-03-11 12:03
回复 9楼 qq372505855
这个问题就不回答你啦,对于++z和z++的区别,你要么翻翻书,要么动手coding测一下,实践出真理。
#15
明天更好山鹰2013-03-11 21:44
回复 8楼 小菜B
a,b,c变量是全局变量,不是静态变量,从下面程序中的位置就可以看出来,全局变量本身就是静态存储方式,初始值为上一次的最后结果。
#include <iostream>
using namespace std;
void prt(int*x,int *y,int *z)
{   
    cout<<++*x<<","<<++*y<<","<<*(z++)<<endl;
   
}
int a=10,b=40,c=20;
void main()
#16
sam0312013-03-11 22:30
以下是引用好聚好散在2013-3-10 16:07:07的发言:

#include <iostream>
using namespace std;
void prt(int*x,int *y,int *z)
{   
    cout<<++*x<<","<<++*y<<","<<*(z++)<<endl;
    cout << &z<<endl;
   
   
}
int a=10,b=40,c=20;
void main()
{
    prt(&a,&b,&c);
    cout<<&c<<endl;
    prt(&a,&b,&c);
   cout << &c<<endl;
   
}

11,41,20
0012FEF8
00477DC8
12,42,20
0012FEF8
00477DC8
请六楼解释下Z的地址为什么也没变呢??


z的地址当然没有变,因为你是取的是指针z的地址
z指向的是&c这个地址,但z指针本身也有地址啊,&z当然不变了
#17
huang19381202013-03-12 18:02
++i i++ 一向是俺们菜鸟们所要攻克的难题
#18
qq3725058552013-03-12 18:59
回复 14楼 Pirelo
好吧,谢谢您的回答
#19
随着心飞翔2013-03-12 22:25
Z的值是地址增加,所以传出来的值不变的
#20
a5116376942013-03-15 11:57
加i++就可以了
#21
tsyking2013-03-19 23:19
这是传参的问题,
你传进去的是数据的地址,并不是指针的地址,所以你只能修改指针志向的数据而不能修改指针,,而要修改指针的志向就必须传指针的地址进去
1