{
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呢。
18 个解决方案
#1
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);
#2
#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);
}
#3
楼上的都给出了答案,我就稍微解释一下啊
void change(struct IPM *t_1, struct IPM *t_2)
这个函数你传过去的是两个指针,但是传的是指针的值,也就是说你在里面改变了指针的指向地址是没有用的,因为值传递,原来的指针并未改变。
造成这一个误解的原因是经典的swap函数 void swap(int *a, int *b)可以交换成功。那个传的也是指针的值,但是他改变的是指针的值指向的内容,而不是指针的值。
再好好理解一下,值传递,指针,指针指向的内容,指针的内容这几个概念。
void change(struct IPM *t_1, struct IPM *t_2)
这个函数你传过去的是两个指针,但是传的是指针的值,也就是说你在里面改变了指针的指向地址是没有用的,因为值传递,原来的指针并未改变。
造成这一个误解的原因是经典的swap函数 void swap(int *a, int *b)可以交换成功。那个传的也是指针的值,但是他改变的是指针的值指向的内容,而不是指针的值。
再好好理解一下,值传递,指针,指针指向的内容,指针的内容这几个概念。
#4
#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);
}
#5
#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);
}
#6
很是不好意思点错了
#7
调用写错了
#8
好题目,huiguixian总结很给力啊
#9
调用不对,你传的是指针的值,没用的应该是指针的地址 **p
和int f(int a,int b)
传入是是一样的。不是一个内存空间了,只是赋值操作
和int f(int a,int b)
传入是是一样的。不是一个内存空间了,只是赋值操作
#10
过来学习了。
#11
void change(struct IPM & *t_1, struct IPM & *t_2)
{
t_1 = t_2;
}
就OK了
{
t_1 = t_2;
}
就OK了
#12
--
应该是指针的引用(*&),而不是引用的指针(&*,这是非法的)。
下面这么写也是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);
}
#13
lz 的程序通过了编译?
你在 main 中定义了另一个函数!
你在 main 中定义了另一个函数!
#14
void change(struct IPM **t_1, struct IPM **t_2)
{
*t_1 = *t_2;
}
change(&c,&b);
lz先把形参、实参搞懂吧。
{
*t_1 = *t_2;
}
change(&c,&b);
lz先把形参、实参搞懂吧。
#15
函数的参数会产生临时变量,要想通过函数参数改变原来的变量值,参数要用指针形式。也就是改变普通变量参数用指针,改变指针变量,参数用指针的指针(即二级指针)
#16
++
#17
总结一下啊:
这是一个实参传递,在函数体内,使用的是传递参数的副本,而参数本身是没有被改变的。
如果想在函数内部改变参数的值,那么可以用引用(这里是指针引用 type* & virable)
也可以用指针的,但是这里应该用指针的指针(type * * virable)在参数内部改变指针的值就可以了
#18
有一点忘记说了,编译器是gcc,不支持引用调用。
感谢各位,明白了。
散分
感谢各位,明白了。
散分
#1
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);
#2
#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);
}
#3
楼上的都给出了答案,我就稍微解释一下啊
void change(struct IPM *t_1, struct IPM *t_2)
这个函数你传过去的是两个指针,但是传的是指针的值,也就是说你在里面改变了指针的指向地址是没有用的,因为值传递,原来的指针并未改变。
造成这一个误解的原因是经典的swap函数 void swap(int *a, int *b)可以交换成功。那个传的也是指针的值,但是他改变的是指针的值指向的内容,而不是指针的值。
再好好理解一下,值传递,指针,指针指向的内容,指针的内容这几个概念。
void change(struct IPM *t_1, struct IPM *t_2)
这个函数你传过去的是两个指针,但是传的是指针的值,也就是说你在里面改变了指针的指向地址是没有用的,因为值传递,原来的指针并未改变。
造成这一个误解的原因是经典的swap函数 void swap(int *a, int *b)可以交换成功。那个传的也是指针的值,但是他改变的是指针的值指向的内容,而不是指针的值。
再好好理解一下,值传递,指针,指针指向的内容,指针的内容这几个概念。
#4
#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);
}
#5
#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);
}
#6
很是不好意思点错了
#7
调用写错了
#8
好题目,huiguixian总结很给力啊
#9
调用不对,你传的是指针的值,没用的应该是指针的地址 **p
和int f(int a,int b)
传入是是一样的。不是一个内存空间了,只是赋值操作
和int f(int a,int b)
传入是是一样的。不是一个内存空间了,只是赋值操作
#10
过来学习了。
#11
void change(struct IPM & *t_1, struct IPM & *t_2)
{
t_1 = t_2;
}
就OK了
{
t_1 = t_2;
}
就OK了
#12
--
应该是指针的引用(*&),而不是引用的指针(&*,这是非法的)。
下面这么写也是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);
}
#13
lz 的程序通过了编译?
你在 main 中定义了另一个函数!
你在 main 中定义了另一个函数!
#14
void change(struct IPM **t_1, struct IPM **t_2)
{
*t_1 = *t_2;
}
change(&c,&b);
lz先把形参、实参搞懂吧。
{
*t_1 = *t_2;
}
change(&c,&b);
lz先把形参、实参搞懂吧。
#15
函数的参数会产生临时变量,要想通过函数参数改变原来的变量值,参数要用指针形式。也就是改变普通变量参数用指针,改变指针变量,参数用指针的指针(即二级指针)
#16
++
#17
总结一下啊:
这是一个实参传递,在函数体内,使用的是传递参数的副本,而参数本身是没有被改变的。
如果想在函数内部改变参数的值,那么可以用引用(这里是指针引用 type* & virable)
也可以用指针的,但是这里应该用指针的指针(type * * virable)在参数内部改变指针的值就可以了
#18
有一点忘记说了,编译器是gcc,不支持引用调用。
感谢各位,明白了。
散分
感谢各位,明白了。
散分