鱼C论坛

 找回密码
 立即注册
查看: 3514|回复: 12

指针运算的一个问题不明白

[复制链接]
发表于 2012-3-9 08:40:44 | 显示全部楼层 |阅读模式
1鱼币
本帖最后由 浩宇 于 2012-3-10 00:38 编辑

【例10.4】请注意,不能企图通过改变指针形参的值而使指针实参的值改变。
swap(int *p1,int *p2) //为什么这个函数不能实现a,b 的交换啊?
{int *p;
p=p1;
p1=p2;
p2=p;
}
main()
{
int a,b;
int *pointer_1,*pointer_2;
  scanf("%d,%d",&a,&b);
  pointer_1=&a;pointer_2=&b;
  if(a<b) swap(pointer_1,pointer_2);
  printf("\n%d,%d\n",*pointer_1,*pointer_2);
  }
其实我想问的是一下的题目对比,同样的目的,得不到同样的结果;
#if(1)
#include <stdio.h>
void main()
{
int *p1, *p2, *p;
int a, b;
scanf("%d %d", &a, &b);
p1 = &a;
p2 = &b;
if(a<b)
{
  p = p1;
  p1 = p2;
  p2 = p;
}
printf("\na=%d, b=%d\n", a, b);
printf("max=%d, min=%d\n", *p1, *p2);
}
#endif




#if(0)
#include <stdio.h>
swap(int *p1, int *p2)
{
int *p;
p = p1;
p1 = p2;
p2 = p;
}
void main()
{
int *pointer_1, *pointer_2;
int a, b;
scanf("%d %d", &a, &b);
pointer_1 = &a;
pointer_2 = &b;
if(a<b)
  swap(pointer_1, pointer_2);

printf("a = %d, b = %d", a, b);
printf("\nmax=%d min=%d\n", *pointer_1, *pointer_2);
}
#endif

最佳答案

查看完整内容

swap(int *p1,int *p2) {int p; //p不能是指针 p=*p1; *p1=*p2; //p1 p2都是指针,代表一个地址,应交换的是地址中的数据 *p2=p; }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-3-9 08:40:45 | 显示全部楼层
swap(int *p1,int *p2)
{int p;      //p不能是指针
p=*p1;  
*p1=*p2; //p1 p2都是指针,代表一个地址,应交换的是地址中的数据
*p2=p;
}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-3-9 09:47:19 | 显示全部楼层
指针pointer_1,pointer_2在swap函数中指向了不同的值,但当返回主函数时pointer_1,pointer_2仍然指向的分别时a,b的值
main()
{

    int a,b;
    int *pointer_1,*pointer_2,*p;

    scanf("%d,%d",&a,&b);
    pointer_1=&a;
    pointer_2=&b;

    if(a<b)
    {
        p=pointer_1;
        pointer_1=pointer_2;
        pointer_2=p;
    }
    printf("\n%d,%d\n",a,b);
    printf("\n%d,%d\n",*pointer_1,*pointer_2);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-3-9 10:31:52 | 显示全部楼层
swap()函数中的int *p是存放在栈里面的,调用玩栈就释放了也就是p2是个无效的野指针了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-3-9 13:50:50 | 显示全部楼层
形参改为指针引用或二级指针试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-7-11 11:30:27 | 显示全部楼层
精品贴子
有两个程序,你看一下它们的运行结果为什么不是一样的?
有两个程序,你看一下它们的运行结果为什么不是一样的?

程序一:

#include <stdio.h>

void swap(int *a,int *b)

{

int t;

t=*a;*a=*b;*b=t;

}

void main()

{

int x,y;

printf("请输入2个整数: ");

scanf("%d%d",&x,&y);

printf("(1)x=%d,y=%d\n",x,y);

swap(&x,&y);

printf("(2)x=%d,y=%d\n",x,y);

}

程序二:

#include <stdio.h>

void swap(int *a,int *b)

{

int *t;

t=a;a=b;b=t;

}

void main()

{

int x,y;

printf("请输入2个整数: ");

scanf("%d%d",&x,&y);

printf("(1)x=%d,y=%d\n",x,y);

swap(&x,&y);

printf("(2)x=%d,y=%d\n",x,y);

经我调试发现程序二中的下列语句没有执行:

void swap(int *a,int *b)

{

int *t;

t=a;a=b;b=t;

}

这段语句为什么不能被执行呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-7-11 16:01:37 | 显示全部楼层
swap(int *p1,int *p2) //为什么这个函数不能实现a,b 的交换啊?

{int *p;

p=p1;

p1=p2;

p2=p;

}
这个函数 你交换的是地址  不是交换指向
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-1-10 09:48:40 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-1-11 21:36:46 | 显示全部楼层
因为一般形参是系统为函数另外申请的空间来存放,也就是说系统帮我们复制了一个形参的值。所以你可以改变其值指向的内容却并不能改变形参本身的值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-1-30 13:55:39 | 显示全部楼层
{int *p;

p=p1;

p1=p2;

p2=p;
你这里只是交互地址, 而不是交互地址所指向的数据。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-1-31 16:57:55 | 显示全部楼层
Mark up 一下,留个印

                               
登录/注册后可看大图























                               
登录/注册后可看大图

派蒙孕妇防辐射服
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-6-6 15:35:23 | 显示全部楼层
长长见识。。。。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-6-6 18:24:22 | 显示全部楼层
丿夏夜灬彬刂 发表于 2012-7-11 16:01
swap(int *p1,int *p2) //为什么这个函数不能实现a,b 的交换啊?

{int *p;

可以这么来
swap(int *p1, int *p2){
     int tmp = *p1;
     *p1 = *p2;
      *p2 = tmp;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-15 06:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表