有关指针赋值的问题,着急。

microsoft911 2010-04-19 12:15:32
简单代码如下:
#include <stdio.h>

void test1(int* px, int* py){
px=py;
}

void test2(int* px, int* py){
*px=*py;
}

void test3(int &m, int & n){//这里用了c++的引用
m=n;
}
int main(){
int x=1;
int y=2;
int z=3;

int m=4;
int n=5;

int * px=&x;
int * py=&y;
int * pz=&z;

test1(px,py);
printf("%d\n",*px);

test2(px,py);
printf("%d\n",*px);

px=pz;//为什么 test1函数不可以改变px的值, 而main函数里直接px=py, 可以改变px的值?
printf("%d\n",*px);

test3(m,n);
printf("%d\n",m);
return 0;
}


输出结果:
1
2
3
5
Press any key to continue

-----------------------------------------------------------------------------------
我的问题是:
1 为什么 test1函数不可以改变px的值? 而test2,test3都可以?
2 为什么 test1函数不可以改变px的值, 而main函数里直接px=py, 可以改变px的值?

回答好的立刻送分,恳求高手指点。
...全文
106 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2010-04-19
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
yuanzhang198711 2010-04-19
  • 打赏
  • 举报
回复
如果把test1方法改成这个样子:

void test1(int *px, int *py){
px = py;
printf("%4d%4d\n",*px,*py);
}

这个时候,px指针所指向的值的确改变了,但是函数是个封装体,而函数中两个指针的地址与mian()中地址是一样,但只是临时的改变,函数结束后,出栈地址恢复原来。
cattycat 2010-04-19
  • 打赏
  • 举报
回复
test1的参数虽然是指针,但你在test1中px=py;是给指针赋值,*px才是x的内存单元。main函数中px=py,实际上px指针指向了y的地址了。
selooloo 2010-04-19
  • 打赏
  • 举报
回复
test1虽然形参是指针,但也是值传递,传递的只是副本,就是重新定义了两个对象,值和它的实参相同。
test1对它的修改,只是修改的都是它的副本而已,
main里的修改就是对它的真身修改了
huanmie_09 2010-04-19
  • 打赏
  • 举报
回复
我的问题是:
1 为什么 test1函数不可以改变px的值? 而test2,test3都可以?
2 为什么 test1函数不可以改变px的值, 而main函数里直接px=py, 可以改变px的值?

首先,要知道c语言里所有实参的传递都是值传递.即实参传递的不是实参本身,而是它的一个副本,在调用函数中对参数进行修改,函数退出后并不能影响实参的值.
void test1(int* px, int* py){
px=py;
}
这里只是在函数中修改了px的指向.函数退出后,对main函数中的px的指向并不影响,指向的内容也没有发生改变。

void test2(int* px, int* py){
*px=*py;
}
这里在函数中修改了px的指向地址的内容.函数退出后,对main函数中的px并不影响,但是它所指向的内容已经改变了。

void test3(int &m, int & n){//这里用了c++的引用
m=n;
}
引用传递操作的就是变量本身,这是c++里的。对引用的操作相当于对函数外的变量的操作.

第二个问题,如果你在test1函数中打印一下px的值还有指向的内容就应该知道了.
wzywsk 2010-04-19
  • 打赏
  • 举报
回复
函数传递的单向性~~px的值并未传回使用没有改变
bobo364 2010-04-19
  • 打赏
  • 举报
回复
因为主函数里定义了px,py的地址,两者互换等于换地址,而那个test1,传递的只是一个指针,交换指针但其指向的内容并未交换,所以才会有如上问题
bEst_02 2010-04-19
  • 打赏
  • 举报
回复
void test1(int* px, int* py){
px=py;
}

再压栈时,传入的是指针地址,你使用px=py;只是改变了栈上的内容,并没有改变px指向的内存内容。
febbird1984 2010-04-19
  • 打赏
  • 举报
回复
main中的px,py和test1中的px,py重名了,为了区分,暂且将main中的称为mpx,mpy,而test1中的称为tpx,tpy
那么在调用test1(px,py)的时候,相当于调用test(mpx,mpy)
这个过程可以看做
{
tpx=mpx;
tpy=mpy;
tpx=tpy;//可以看出只是将tpy的值赋给了tpx,而mpx和mpy没有发生改变
}
wade_2003 2010-04-19
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 cattycat 的回复:]
test1的参数虽然是指针,但你在test1中px=py;是给指针赋值,*px才是x的内存单元。main函数中px=py,实际上px指针指向了y的地址了。
[/Quote]
应该是这样的
LittleJohny 2010-04-19
  • 打赏
  • 举报
回复
实参,形参,值传递
1.所谓实参,即调用函数时函数括号后的参数即test1(px,py);
2.所谓形参,即定义函数时函数括号后的参数即void test1(int* px, int* py)中的px,py;
3.值传递,c语言中,实参向形参的数据传递时“值传递”,单向传递,只由实参传递给形参,在调用函数时,给形参分配存储单元,并将实参对应的值传递给形参,调用结束后,形参单元被释放,实参单元仍然保留原值。
cclovechao 2010-04-19
  • 打赏
  • 举报
回复
就像这个函数void swap( int a, int b )
{
a = b;
}
在main函数里a还是a的值
cclovechao 2010-04-19
  • 打赏
  • 举报
回复
因为test1是calledbyvalue!这个value就是px所存的x的地址。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧