指向函数的指针变量量作为参数,函数体只交换参数的地址,为什么a,b,*p1,*p2的值和地址都没发生变化。下面是代码

欢迎加入我们,一同切磋技术。 &
用户名: &&&
密 码: &
共有 3694 人关注过本帖
标题:我一直不明白指针作为函数参数为什么可以改变实际参数的值?
等 级:论坛游民
帖 子:34
专家分:27
结帖率:75%
&&已结贴√
&&问题点数:20&&回复次数:5&&&
我一直不明白指针作为函数参数为什么可以改变实际参数的值?
我一直不明白指针作为函数参数为什么可以改变实际参数的值?
就可以看下这个例子:
#include&stdio.h&
void main()
&&void swap(int *p1,int *p2);
&&int *pointer_1,*pointer_2;
&&int a,b;
&&scanf(&%d,%d&,&a,&b);
&&pointer_1=&a;
&&pointer_2=&b;
&&&&&&swap(pointer_1, pointer_2);
&&printf(&%d,%d&,a,b);
void swap(int *p1,int *p2)
&&& t= *p1;
&&& *p1=*p2;
&&& *p2=t;
&&& getchar();
&&& getchar();
&&& getchar();
&&& getchar();
比如 输入 5 9
结果&&&&&&9 5
指针交换了,只能改变他所指向的值,但是怎么样的去改变a,b的值呢?
或许举出一个更好的例子加以说明下!
very thankyou!
搜索更多相关主题的帖子:
等 级:等待验证会员
帖 子:282
专家分:704
指针里面存放的是a和b的地址,你吧a和b的地址交换了,而你的输出顺序还是按照原先的顺序输出。
等 级:蝙蝠侠
帖 子:251
专家分:975
pointer_1——&a, pointer_2——&b;
swap(int *p1,int *p2)
&t= *p1;//t=a;
&*p1=*p2;//a=b;
&*p2=t;//b=t
等 级:论坛游民
帖 子:34
专家分:27
来 自:广州
等 级:小飞侠
帖 子:1041
专家分:2730
嗯,传值只是复制值,传指针是复制地址(指针存储地址,实质也是传值)。
想象力征服世界
来 自:广州
等 级:论坛游侠
帖 子:168
专家分:174
定义变量的时候分配固定的地址给它,函数调用(地址传递)的时候把地址传给函数的行参,当对行参(地址)所对应的量进行运算等操作时实际已经改变了变量。而值传递只是把值复制过去进行操作,实际没改变内存地址所对应的变量
版权所有,并保留所有权利。
Powered by , Processed in 0.047453 second(s), 7 queries.
Copyright&, BCCN.NET, All Rights Reserved关注51Testing
指针变量作为函数参数的一点用法
发表于: 10:41 &作者:未知 & 来源:51Testing软件测试网采编
推荐标签:
  C语言中,函数的参数可以是整型,实型,字符型,指针类型;如果用指针做为函数参数传到被调用函数的话,可以实现使变量的值发生变化,在主调函数(例如:main函数中)使用这些已经改变了的值的目的。先看段代码吧  代码  #include &stdio.h&  swap(int *a,int *b)  {  *a=*a+*b;  *b=*a-*b;  *a=*a-*b;  }  main()  {  int a,b;  int *p1,*p2;  printf("请输入两个数据用于交换:");  scanf("%d,%d",&a,&b);  p1=&a;  p2=&b;  swap(p1,p2);  printf("\n不用第三方变量的交换结果是:%d,%d\n",a,b);  }  这是一段经典的C语言中不使用临时变量实现两个变量交换的代码。在main函数中定义了两个整型变量,两个指针变量,并使p1=&a,p2=&b;然后调用swap函数,看结果吧  已经实现了两个数的交换 。  然后把swap函数改一下,改成如下:  swap(int *a,int *b)  {  int *  *temp=*a;  *a=*b;  *b=*  }  改成这样子之后就报错了。  究其原因是因为指针变量temp无确定地址,它的值是不可预见的。  当把函数改为这样子的时候也是不行的。  swap(int a,int b)  {    temp=a;  a=b;  b=  }  调用这个版本的函数,形参a,b的值是改变了,但主调函数却使用不了改变后的值。  下面的写法就可以在主调函数中使用改变后的值了。  swap(int *a,int *b)  {    temp=*a;  *a=*b;  *b=  }  C语言的指针用法太灵活了,代码在书写过程中也没有注意编码规范。
搜索风云榜
51Testing官方微信
51Testing官方微博
测试知识全知道用户名:Qlinux
文章数:214
评论数:91
访问量:316428
注册日期:
阅读量:1297
阅读量:3317
阅读量:457229
阅读量:1141879
51CTO推荐博文
指针变量做为函数的参数
函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针类型。它的作用是将一个变量的地址传送到另一个函数中。
【例10.3】题目同例10.2,即输入的两个整数按大小顺序输出。今用函数处理,而且用指针类型的数据作函数参数。
#include&&swap(int&*p1,int&*p2)&{&&int&&&temp=*p1;&&*p1=*p2;&&*p2=temp;&}&main()&{&&&int&a,b;&&&int&*pointer_1,*pointer_2;&&&scanf(&%d,%d&,&a,&b);&&&pointer_1=&a;&&&pointer_2=&b;&&&if(a)&swap(pointer_1,pointer_2);&&&printf(&\n%d,%d\n&,a,b);&}&&对程序的说明: 1、swap是用户定义的函数,它的作用是交换两个变量(a和b)的值。swap函数的形参 p1、p2是指针变量。程序运行时,先执行main函数,输入a和b的值。然后将a和b的地址分别赋给指针变量pointer_1和pointer_2, 使pointer_1指向a,pointer_2指向b。 2、接着执行if语句,由于a〈b,因此执行swap函数。注意实参pointer_1和pointer_2是指针变量,在函数调用时,将实参变量的值传 递给形参变量。采取的依然是&值传递&方式。因此虚实结合后形参p1的值为&a,p2的值为&b。这时p1和pointer_1指向变量 a,p2和pointer_2指向变量b。 3、接着执行执行swap函数的函数体使*p1和*p2的值互换,也就是使a和b的值互换。函数调用结束后,p1和p2不复存在(已释放)如图。 4、最后在main函数中输出的a和b的值是已经过交换的值。
请注意交换*p1和*p2的值是如何实现的。请找出下列程序段的错误: swap(int *p1,int *p2) {int * &*temp=*p1;&&&&& /*此语句有问题*/ &*p1=*p2; &*p2= } 请考虑下面的函数能否实现实现a和b互换。 swap(int x,int y) { &temp=x; &x=y; &y= } 如果在main函数中用&swap(a,b);&调用swap函数,会有什么结果呢?请看下图所示。 【例10.4】请注意,不能企图通过改变指针形参的值而使指针实参的值改变。
#include&&swap(int&*p1,int&*p2)&{&&&&&&int&*p;&&&&&&p=p1;&&&&&&p1=p2;&&&&&&pp2=p;&}&main()&{&&&&&int&a,b;&&&&&int&*pointer_1,*pointer_2;&&&&&scanf(&%d,%d&,&a,&b);&&&&&pointer_1=&a;&&&&&pointer_2=&b;&&&&&if(a)&swap(pointer_1,pointer_2);&&&&&printf(&\n%d,%d\n&,*pointer_1,*pointer_2);&}&例5,输入3个数,改变大小顺序.
#include&&swap(int&*pt1,int&*pt2)&{&&&&&&int&&&&&&&temp=*pt1;&&&&&&*pt1=*pt2;&&&&&&*pt2=temp;&}&&exchange(int&*q1,int&*q2,int&*q3)&{&&&&&&&if(*q1*q2)swap(q1,q2);&&&&&&if(*q1*q3)swap(q1,q3);&&&&&&if(*q2*q3)swap(q2,q3);&}&&main()&{&&&&&&&int&a,b,c,*p1,*p2,*p3;&&&&&&&scanf(&%d,%d,%d&,&a,&b,&c);&&&&&&&p1=&a;p2=&b;&p3=&c;&&&&&&&exchange(p1,p2,p3);&&&&&&&printf(&\n%d,%d,%d&\n&,a,b,c);&}&
&本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)指针-函数参数易错点分析 - 向上吧,少年! - ITeye博客
博客分类:
例:输入a和b两个整数,按照先大后小的顺序输出a和b。
#include &stdio.h&
int main(){
void swap(int *p1,int *p2);
int * pointer_1,* pointer_2;
printf("please enter a and b:");
scanf("%d,%d",&a,&b);
pointer_1 = &a;
pointer_2 = &b;
if(a&b) swap(pointer_1,pointer_2);
printf("max=%d,min=%d\n",a,b);
void swap(int *p1,int *p2){
temp = *p1;
*p1 = *p2;
上述例子中,我们定义两个指针变量和基本变量。首先给基本变量赋值,并将基本变量的地址赋值给指针变量
然后用指针变量作为函数参数,调用swap方法。
在swap方法中,因为*p1,*p2就是指代具体的a,b两个变量,所以我们定义的一个中间变量就不能用指针类型。
如果我们中间变量定义为 int * temp ,这时会出错,因为,*p1是a变量的值,不是地址。所以将一个值赋给变量是不正确的。
因此,我们交换*p1和*p2的值,也就是交换了a和b的值。
当然,最后我们打印出来的最大值是a,最小值是b了。
下面是一个程序正确,但是逻辑上错误的代码
#include &stdio.h&
int main(){
void swap(int *p1,int *p2);
int * pointer_1,* pointer_2;
printf("please enter a and b:");
scanf("%d,%d",&a,&b);
pointer_1 = &a;
pointer_2 = &b;
if(a&b) swap(pointer_1,pointer_2);
printf("max=%d,min=%d\n",a,b);
void swap(int *p1,int *p2){
上面程序和先前程序的区别在于。我们在swap函数中,定义了一个作中间变量的指针。
然后,将指针变量p1赋值给找你关键变量,即将p1指针所指向的地址赋值给了p,
接着,将指针变量所保存的地址赋值给p1,所有指针p的地址赋值给p2。
完成了,对指针p1,p2 地址的 交换,但是 变量a和b两个值并没有交换。
最后,给除一个稍微复杂点的例子。
输入三个整数a,b,c,需求按照从大到小的顺序将它们输出。用函数实现,用指针实现
#include &stdio.h&
int main(){
void exchange(int *q1, int *q2, int *q3);
int a,b,c,*p1,*p2,*p3;
printf("please enter three numbers:");
scanf("%d,%d,%d",&a,&b,&c);
p1 = &a; p2 = &b; p3 = &c;
exchange(p1,p2,p3);
printf("The order is :%d,%d,%d\n",a,b,c);
void exchange(int *q1, int *q2, int *q3){
void swap(int *pt1, int *pt2);
if(*q1 & *q2) swap(q1,q2);
if(*q1 & *q3) swap(q1,q3);
if(*q2 & *q3) swap(q2,q3);
void swap(int *pt1, int *pt2){
if(*pt1 & *pt2){
temp = *pt1;
浏览: 176948 次
来自: 上海
你好,我运行到第四步,添加表视图及其数据,但最后表格数据没有显 ...
@bugcn 客气客气,我也是照着别人写的例子,然后边做边写。 ...
顶一个,这样的教程对我这样的初学者太有用了,博主辛苦啦}

我要回帖

更多关于 结构体指针变量 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信