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

时间:2022-03-09 18:49:15
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呢。

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)可以交换成功。那个传的也是指针的值,但是他改变的是指针的值指向的内容,而不是指针的值。

再好好理解一下,值传递,指针,指针指向的内容,指针的内容这几个概念。

#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


引用 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;            //
……

很是不好意思点错了

#7


调用写错了

#8


好题目,huiguixian总结很给力啊

#9


调用不对,你传的是指针的值,没用的应该是指针的地址  **p
和int f(int a,int b)
传入是是一样的。不是一个内存空间了,只是赋值操作

#10


过来学习了。

#11


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

t_1 = t_2;

}
就OK了

#12


引用 11 楼 simoreg 的回复:
void change(struct IPM &amp; *t_1, struct IPM &amp; *t_2)
{

t_1 = t_2;

}
就OK了


--
应该是指针的引用(*&),而不是引用的指针(&*,这是非法的)。
下面这么写也是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 中定义了另一个函数!

#14


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

*t_1 = *t_2;

}
change(&c,&b);

lz先把形参、实参搞懂吧。

#15


函数的参数会产生临时变量,要想通过函数参数改变原来的变量值,参数要用指针形式。也就是改变普通变量参数用指针,改变指针变量,参数用指针的指针(即二级指针)

#16


引用 3 楼 huiguixian 的回复:
楼上的都给出了答案,我就稍微解释一下啊
void change(struct IPM *t_1, struct IPM *t_2)
这个函数你传过去的是两个指针,但是传的是指针的值,也就是说你在里面改变了指针的指向地址是没有用的,因为值传递,原来的指针并未改变。
造成这一个误解的原因是经典的swap函数 void swap(int *a, int *b)可以交换成功。那个传的也是指针的值,但……

++

#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)可以交换成功。那个传的也是指针的值,但是他改变的是指针的值指向的内容,而不是指针的值。

再好好理解一下,值传递,指针,指针指向的内容,指针的内容这几个概念。

#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


引用 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;            //
……

很是不好意思点错了

#7


调用写错了

#8


好题目,huiguixian总结很给力啊

#9


调用不对,你传的是指针的值,没用的应该是指针的地址  **p
和int f(int a,int b)
传入是是一样的。不是一个内存空间了,只是赋值操作

#10


过来学习了。

#11


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

t_1 = t_2;

}
就OK了

#12


引用 11 楼 simoreg 的回复:
void change(struct IPM &amp; *t_1, struct IPM &amp; *t_2)
{

t_1 = t_2;

}
就OK了


--
应该是指针的引用(*&),而不是引用的指针(&*,这是非法的)。
下面这么写也是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 中定义了另一个函数!

#14


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

*t_1 = *t_2;

}
change(&c,&b);

lz先把形参、实参搞懂吧。

#15


函数的参数会产生临时变量,要想通过函数参数改变原来的变量值,参数要用指针形式。也就是改变普通变量参数用指针,改变指针变量,参数用指针的指针(即二级指针)

#16


引用 3 楼 huiguixian 的回复:
楼上的都给出了答案,我就稍微解释一下啊
void change(struct IPM *t_1, struct IPM *t_2)
这个函数你传过去的是两个指针,但是传的是指针的值,也就是说你在里面改变了指针的指向地址是没有用的,因为值传递,原来的指针并未改变。
造成这一个误解的原因是经典的swap函数 void swap(int *a, int *b)可以交换成功。那个传的也是指针的值,但……

++

#17



总结一下啊:
    这是一个实参传递,在函数体内,使用的是传递参数的副本,而参数本身是没有被改变的。
    如果想在函数内部改变参数的值,那么可以用引用(这里是指针引用 type* & virable)
    也可以用指针的,但是这里应该用指针的指针(type * * virable)在参数内部改变指针的值就可以了

#18


有一点忘记说了,编译器是gcc,不支持引用调用。
感谢各位,明白了。
散分