结构体指针做函数参数的问题

neipe2003 2011-06-01 07:28:52
struct IPM
{
int i;
float j;

};

int main(int argc, char **argv)
{

struct IPM a = {2, 3.0};
struct IPM *b;
struct IPM *c;

b = &a;
void change(struct IPM *t_1, struct IPM *t_2)
{

t_1 = t_2;

}
change(c,b);
printf("%d\n", c->i);
}
这么写为什么输出不是2呢。
...全文
610 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
neipe2003 2011-06-03
  • 打赏
  • 举报
回复
有一点忘记说了,编译器是gcc,不支持引用调用。
感谢各位,明白了。
散分
zhanghuayi_xiyou 2011-06-02
  • 打赏
  • 举报
回复
函数的参数会产生临时变量,要想通过函数参数改变原来的变量值,参数要用指针形式。也就是改变普通变量参数用指针,改变指针变量,参数用指针的指针(即二级指针)
aozhi 2011-06-02
  • 打赏
  • 举报
回复
void change(struct IPM **t_1, struct IPM **t_2)
{

*t_1 = *t_2;

}
change(&c,&b);

lz先把形参、实参搞懂吧。
AnYidan 2011-06-02
  • 打赏
  • 举报
回复
lz 的程序通过了编译?

你在 main 中定义了另一个函数!
pathuang68 2011-06-02
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 simoreg 的回复:]

void change(struct IPM & *t_1, struct IPM & *t_2)
{

t_1 = t_2;

}
就OK了
[/Quote]

--
应该是指针的引用(*&),而不是引用的指针(&*,这是非法的)。
下面这么写也是OK的。

#include<iostream>
using namespace std;
struct IPM
{
int i;
float j;

};
void change(struct IPM*& t_1, struct IPM*& t_2) //
{

t_1 = t_2; //
}
int main(int argc, char **argv)
{

struct IPM a = {2, 3.0};
struct IPM *b;
struct IPM *c;

b = &a;

change(c,b); //
printf("%d\n", c->i);
}
simoreg 2011-06-02
  • 打赏
  • 举报
回复
void change(struct IPM & *t_1, struct IPM & *t_2)
{

t_1 = t_2;

}
就OK了
elltrack 2011-06-02
  • 打赏
  • 举报
回复
过来学习了。
binggou8993 2011-06-02
  • 打赏
  • 举报
回复

总结一下啊:
这是一个实参传递,在函数体内,使用的是传递参数的副本,而参数本身是没有被改变的。
如果想在函数内部改变参数的值,那么可以用引用(这里是指针引用 type* & virable)
也可以用指针的,但是这里应该用指针的指针(type * * virable)在参数内部改变指针的值就可以了
淡然一笑 2011-06-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 huiguixian 的回复:]
楼上的都给出了答案,我就稍微解释一下啊
void change(struct IPM *t_1, struct IPM *t_2)
这个函数你传过去的是两个指针,但是传的是指针的值,也就是说你在里面改变了指针的指向地址是没有用的,因为值传递,原来的指针并未改变。
造成这一个误解的原因是经典的swap函数 void swap(int *a, int *b)可以交换成功。那个传的也是指针的值,但……
[/Quote]
++
a514688934 2011-06-01
  • 打赏
  • 举报
回复
调用不对,你传的是指针的值,没用的应该是指针的地址 **p
和int f(int a,int b)
传入是是一样的。不是一个内存空间了,只是赋值操作
Daneill 2011-06-01
  • 打赏
  • 举报
回复
好题目,huiguixian总结很给力啊
vcf_reader 2011-06-01
  • 打赏
  • 举报
回复
调用写错了
地狱男爵 2011-06-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 kid_coder 的回复:]
C/C++ code

#include<iostream>
using namespace std;
struct IPM
{
int i;
float j;

};
void change(struct IPM **t_1, struct IPM **t_2) //
{

*t_1 = *t_2; //
……
[/Quote]
很是不好意思点错了
如此美丽的你 2011-06-01
  • 打赏
  • 举报
回复
#include <stdio.h>

struct IPM
{
int i;
float j;

};

void change(struct IPM **t_1, struct IPM **t_2)//函数不允许嵌套定义
{

*t_1 = *t_2;

}

int main(int argc, char **argv)
{

struct IPM a = {2, 3.0};
struct IPM *b;
struct IPM *c;

b = &a;

change(&c,&b);
printf("%d\n", c->i);
}
就想叫yoko 2011-06-01
  • 打赏
  • 举报
回复
#include <stdio.h>

struct IPM
{
int i;
float j;

};

void change(struct IPM **t_1, struct IPM **t_2)
{

*t_1 = *t_2;

}

int main(int argc, char **argv)
{

struct IPM a = {2, 3.0};
struct IPM *b;
struct IPM *c;

b = &a;

change(&c,&b);
printf("%d\n", c->i);
}
小小攻城师 2011-06-01
  • 打赏
  • 举报
回复
楼上的都给出了答案,我就稍微解释一下啊
void change(struct IPM *t_1, struct IPM *t_2)
这个函数你传过去的是两个指针,但是传的是指针的值,也就是说你在里面改变了指针的指向地址是没有用的,因为值传递,原来的指针并未改变。
造成这一个误解的原因是经典的swap函数 void swap(int *a, int *b)可以交换成功。那个传的也是指针的值,但是他改变的是指针的值指向的内容,而不是指针的值。

再好好理解一下,值传递,指针,指针指向的内容,指针的内容这几个概念。
KID_coder 2011-06-01
  • 打赏
  • 举报
回复

#include<iostream>
using namespace std;
struct IPM
{
int i;
float j;

};
void change(struct IPM **t_1, struct IPM **t_2) //
{

*t_1 = *t_2; //
}
int main(int argc, char **argv)
{

struct IPM a = {2, 3.0};
struct IPM *b;
struct IPM *c;

b = &a;

change(&c,&b); //
printf("%d\n", c->i);
}
ryfdizuo 2011-06-01
  • 打赏
  • 举报
回复
void change(struct IPM **t_1, struct IPM **t_2)
{

*t_1 = *t_2;

}
change(&c, &b);
printf("%d\n", c->i);



第二种指针引用:
void change(struct IPM * &t_1, struct IPM * &t_2)
{

t_1 = t_2;

}
change(c, b);
printf("%d\n", c->i);


69,370

社区成员

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

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