菜鸟关于指针的两个问题

Seffrui_M 2012-10-26 04:29:28
用指针输出两个数中的最大值
#include<stdio.h>
int main()
{
void swap(int *p1,int *p2);
int a,b;int *pi1,*pi2;
printf("please enter a and b");
scanf("%d%d",&a,&b);
pi1=&a;pi2=&b;
if(a<b) swap(pi1,pi2);
printf("max=%d,min=%d",a,b);
return 0;
}
void swap(int *p1,int *p2)
{
int t;
t=*p1;*p1=*p2;*p2=t;
}
答案是这么写的 运行正确 我就写的是下面的
#include<stdio.h>
int main()
{
void swap(int *p1,int *p2);
int a,b;int *pi1,*pi2;
printf("please enter a and b");
scanf("%d%d",&a,&b);
pi1=&a;pi2=&b;
if(a<b) swap(pi1,pi2);
printf("max=%d,min=%d",a,b);
return 0;
}
void swap(int *p1,int *p2)
{
int *t;
t=p1;p1=p2;p2=t;
}
为什么不可以直接交换指针 ?求大神们详细解释一下啊


还有一个问题 怎么用指针指向3个数组
我想用指针调用已定义的三个数组a[10],b[10],c[10]
char *array(a[10],b[10],c[10])
括号里面是应该写数组的首地址还是数组名还是不能这么调用 求大神门给出规范写法
...全文
225 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiangjian0001 2012-11-03
  • 打赏
  • 举报
回复
楼主真想交换指针,那就把形参改成二级指针
olderma 2012-10-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

第一个swap函数:在栈区单独开辟了三个内存区域p1,p2,t,在main函数调用swap时,将a的地址和b的地址分别传递给p1和p2,
t=*p1;把p1指向的内存里面的值赋值(a)给t;
*p1=*p2;把p2指向的内存里面的值(b)赋值给p1指向的内存(即a);
*p2=t;把t赋值给p2指向的内存(把a赋值给了b)
这三步都操作了a和b区域,在函数调用结束后,p1,p2,t的内存……
[/Quote]
很好很强大
lzqxs89 2012-10-29
  • 打赏
  • 举报
回复
同意六楼的分析,很详细。
jiemo1123 2012-10-27
  • 打赏
  • 举报
回复
第一个swap函数:在栈区单独开辟了三个内存区域p1,p2,t,在main函数调用swap时,将a的地址和b的地址分别传递给p1和p2,
t=*p1;把p1指向的内存里面的值赋值(a)给t;
*p1=*p2;把p2指向的内存里面的值(b)赋值给p1指向的内存(即a);
*p2=t;把t赋值给p2指向的内存(把a赋值给了b)
这三步都操作了a和b区域,在函数调用结束后,p1,p2,t的内存区域都被释放了,ab的值已经改变了

第二个swap函数:在栈区单独开辟了三个内存区域p1,p2,t,在main函数调用swap时,将a的地址和b的地址分别传递给p1和p2,
t=p1;把p1赋值给t(a的地址给t)
p1=p2;把p2赋值给p1(b的地址给a)
p2=t;把t赋值给p2(a的地址给b的地址)
并没有实际改变a和b的值,在函数调用结束后,p1,p2,t的内存区域都被释放了,ab的值还是不变

不用通过改变形参的值去改变实参的值,因为形参和实参在内存中是完全不同的区域,形参的值改变了,不会影响实参,而且函数调用结束后,分配给形参的内存区域会被释放。这类问题可以在纸上画出内存区域来分析。

指针指向3个数组要用二维数组
JiMoKuangXiangQu 2012-10-27
  • 打赏
  • 举报
回复
"我想用指针调用已定义的三个数组a[10],b[10],c[10]"
下面的代码可以参考一下.

#include <stdio.h>

int main(void)
{
int a[2] = {1, 2},
b[2] = {3, 4},
c[2] = {5, 6};
int *arrs[] = {a, b, c};
int i, j;

for (i = 0; i < 3; i++)
{
int *pa = arrs[i];
printf("Array %d: \n", i);
for (j = 0; j < 2; j++)
printf("%d ", pa[j]);
printf("\n\n");
}

return 0;
}
DHL1234567 2012-10-27
  • 打赏
  • 举报
回复
修改了内存中副本的地址我有个PPT关于这个的!一模一样的
DHL1234567 2012-10-27
  • 打赏
  • 举报
回复
你那样只是在内存中修改,没对真实的值进行改!
m筱米 2012-10-26
  • 打赏
  • 举报
回复
来学习下~~
坐等讲解。
easyrem 2012-10-26
  • 打赏
  • 举报
回复
指针是局部变量,你交换完了以后,函数结束又被释放。
所以,作为输出要用* 或者& ,你再交换指针不就有问题了吗?

指向3个数组,要做2维指针。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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