C语言指针问题~ 交换 a 和 b的值 为什么在swap里面交换地址运行以后a和b还是没有交换?
#include<stdio.h>voidmain(){inta,b;int*p1,*p2;scanf("%d,%d",&a,&b);printf("a=%d,b=%d\...
#include <stdio.h>
void main(){
int a,b;
int *p1, *p2;
scanf("%d, %d", &a, &b);
printf("a = %d, b = %d\n",a,b);
p1 = &a; p2 = &b;
void swap(int *pa, int *pb);
swap(p1, p2);
printf("a = %d, b = %d\n", a,b);
}
void swap(int *pa, int *pb)
{
int *p;
p = pa;
pa = pb;
pb = p;
}
如果直接传pa和pa 作为整形int 在main函数里面不能改变我能理解 但是传的是指针*pa和*pb 指针不是相当于在内存中的地址吗 ? 地址的改变不是绝对的吗? 展开
void main(){
int a,b;
int *p1, *p2;
scanf("%d, %d", &a, &b);
printf("a = %d, b = %d\n",a,b);
p1 = &a; p2 = &b;
void swap(int *pa, int *pb);
swap(p1, p2);
printf("a = %d, b = %d\n", a,b);
}
void swap(int *pa, int *pb)
{
int *p;
p = pa;
pa = pb;
pb = p;
}
如果直接传pa和pa 作为整形int 在main函数里面不能改变我能理解 但是传的是指针*pa和*pb 指针不是相当于在内存中的地址吗 ? 地址的改变不是绝对的吗? 展开
7个回答
展开全部
好多又是粘贴复制的……
你们都没看明白楼主的代码和问题。
楼主,你最关键的不是以指针做参数的问题,是你的代码中的这句:
printf("a = %d, b = %d\n", a,b);
a,b 是变量……指针p1和p2保存的是a和b的地址
函数的参数说起来复杂其实就2种传递,值传递和引用传递,有的人说什么地址传递或指针传递,这其实也是值传递。值传递和引用传递针对的是变量本身,而非通过变量的值找到内存地址做什么改动。
所以说你的函数 void swap(int *pa, int *pb) 指针 p1,p2代入后会生成2份拷贝 pa,pb
pa保存的值是p1的值,也就是a的地址,pb保存的值是p2的值,也就是b的地址。
所以接下来针对pa和pb进行的值交换操作,其结果只是让pa保存了b的地址,pb保存了a的地址,pa和pb在函数结束调用后,生命周期完结。这函数不会对指针p1和p2有任何的影响。
如果你想交换p1和p2指针的值,那就要把函数写成 void swap(int* &pa, int* &pb)
它表示对一个int型指针的引用,这样你的交换会确实的影响到p1和p2的值,让p1保存了b的地址,p2保存了a的地址。就等于执行了 p1=&b; p2=&a;
但最后的问题是,你选择了打印输出变量 a 和 b。因为从头至尾都没对指针p1、p2指向的内存地址上保存的值做任何改动和操作,所以a和b的值没变。 想看到变化就要把这句改为
printf("a = %d, b = %d\n", *p1, *p2);
是不是很麻烦?所以你完全可以像2楼说的那样直接把函数内容修改一下通过传递进去的地址值直接将该地址上保存的数字进行交换。
你们都没看明白楼主的代码和问题。
楼主,你最关键的不是以指针做参数的问题,是你的代码中的这句:
printf("a = %d, b = %d\n", a,b);
a,b 是变量……指针p1和p2保存的是a和b的地址
函数的参数说起来复杂其实就2种传递,值传递和引用传递,有的人说什么地址传递或指针传递,这其实也是值传递。值传递和引用传递针对的是变量本身,而非通过变量的值找到内存地址做什么改动。
所以说你的函数 void swap(int *pa, int *pb) 指针 p1,p2代入后会生成2份拷贝 pa,pb
pa保存的值是p1的值,也就是a的地址,pb保存的值是p2的值,也就是b的地址。
所以接下来针对pa和pb进行的值交换操作,其结果只是让pa保存了b的地址,pb保存了a的地址,pa和pb在函数结束调用后,生命周期完结。这函数不会对指针p1和p2有任何的影响。
如果你想交换p1和p2指针的值,那就要把函数写成 void swap(int* &pa, int* &pb)
它表示对一个int型指针的引用,这样你的交换会确实的影响到p1和p2的值,让p1保存了b的地址,p2保存了a的地址。就等于执行了 p1=&b; p2=&a;
但最后的问题是,你选择了打印输出变量 a 和 b。因为从头至尾都没对指针p1、p2指向的内存地址上保存的值做任何改动和操作,所以a和b的值没变。 想看到变化就要把这句改为
printf("a = %d, b = %d\n", *p1, *p2);
是不是很麻烦?所以你完全可以像2楼说的那样直接把函数内容修改一下通过传递进去的地址值直接将该地址上保存的数字进行交换。
展开全部
第一个题函数的作用是:如果该字符的ASCII码是偶数,就打印出来。
if(*s%2==0) printf(“%c”,*s);
d的ASCII码是100.g的ASCII码是103.o的ASCII码是111.
所以只打印d。所以选a。
第二题:
要理解参数传递的机制。我给你大体说一下吧。
当参数传递的时候,会自动创建实参的副本传入函数,注意传进去的是副本而并非实参本身,无论你参数是值还是指针。对于这个题目,它改变的是p,q的副本的值。p,q并没有改变,所以p,q所指的内容没变。所以打印的还是3,5.
lz一定明白下面这个程序不能起到交换值的作用。其实这个和下面的是一个道理。
void swap(int a,int b)
{
int temp;
temp=a;
a=b;
b=temp;
}
如果做到交换值,要这么写:
void fun( int *a,int *b)
{int *c;
*c=a;*a=*b;*b=*c;
}
这时候还是一样,p和q传进去副本,但是它们所指的内容和p,q所指的内容占用的是同一块内存。这句话*c=a;*a=*b;*b=*c;这句话,副本p和q改变了这块内存的值,相应的main函数中的p和q指向的值也就变了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
注意swap的参数 int *pa, int *pb是main的拷贝副本!
所以swap中指针的改变并不能改变main中的指针!
如下:
void swap(int *pa, int *pb)
{
int t;
t = *pa;
*pa = *pb;
*pb = t;
}
所以swap中指针的改变并不能改变main中的指针!
如下:
void swap(int *pa, int *pb)
{
int t;
t = *pa;
*pa = *pb;
*pb = t;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你可以这样写
#include <stdio.h>
void swap(int *pa, int *pb);
void main(){
int a,b;
int *p1, *p2;
scanf("%d, %d", &a, &b);
printf("a = %d, b = %d\n",a,b);
p1 = &a; p2 = &b;
swap(p1, p2);
printf("a = %d, b = %d\n", a,b);
}
void swap(int *pa, int *pb)
{
int p;
p = *pa;
*pa = *pb;
*pb = p;
}
#include <stdio.h>
void swap(int *pa, int *pb);
void main(){
int a,b;
int *p1, *p2;
scanf("%d, %d", &a, &b);
printf("a = %d, b = %d\n",a,b);
p1 = &a; p2 = &b;
swap(p1, p2);
printf("a = %d, b = %d\n", a,b);
}
void swap(int *pa, int *pb)
{
int p;
p = *pa;
*pa = *pb;
*pb = p;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
改成swap(*p1, *p2);,你的代码意思是交换地址了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询