h********m 发帖数: 116 | 1 想写一个函数,传进去两个地址,把第一个的地址赋给第二个,这样两个指针都指向同
一个address:
int *copy(int *s, int *t){
t = s;
return t;
}
可是我下面的测试,输出1,2,1, 为啥b的值没变啊?但是返回的值c是1,不是说明我的
copy函数里,t指向的地址已经变成s指向的地址了么?
int main(int argc, char **argv) {
int a =1, b =2 ;
int *c = copy(&a, &b);
printf("%d, %d, %d", a, b, *c);
return 0;
} | n*****s 发帖数: 6495 | | p********g 发帖数: 61 | 3 each function has its own stack.
When you call copy(), it creates a new frame and initializes s to &a, t to &
b. So s and &a points to the same memory location, but they are different.
After you assign s to t, both of them hold the memory location of a. When
you return, you are just returning the memory address of a, and both s and t
are deallocated.
c gets this pointer, and that's why it prints out 1.
【在 h********m 的大作中提到】 : 想写一个函数,传进去两个地址,把第一个的地址赋给第二个,这样两个指针都指向同 : 一个address: : int *copy(int *s, int *t){ : t = s; : return t; : } : 可是我下面的测试,输出1,2,1, 为啥b的值没变啊?但是返回的值c是1,不是说明我的 : copy函数里,t指向的地址已经变成s指向的地址了么? : int main(int argc, char **argv) { : int a =1, b =2 ;
| c****p 发帖数: 6474 | 4 看你的文字叙述,是想把一个地址赋给另一个地址,那应该这样写:
int *copy(int **s, int **t){
*t = *s;
return *t;
}
但是这样写的话,用下面这段代码调用,后果很严重(有多严重自己试试):
int *c = copy(&&a, &&b); //这就和&b = &a; 一样严重 | r*******e 发帖数: 7583 | 5 &a is a rvalue. I don't think u can apply & operator to a rvalue
so &&a won't compile I guess
【在 c****p 的大作中提到】 : 看你的文字叙述,是想把一个地址赋给另一个地址,那应该这样写: : int *copy(int **s, int **t){ : *t = *s; : return *t; : } : 但是这样写的话,用下面这段代码调用,后果很严重(有多严重自己试试): : int *c = copy(&&a, &&b); //这就和&b = &a; 一样严重
| c****p 发帖数: 6474 | 6 所以我说后果很严重……
【在 r*******e 的大作中提到】 : &a is a rvalue. I don't think u can apply & operator to a rvalue : so &&a won't compile I guess
| p******m 发帖数: 544 | 7 t是&b的一个copy,而不是&b本身
【在 h********m 的大作中提到】 : 想写一个函数,传进去两个地址,把第一个的地址赋给第二个,这样两个指针都指向同 : 一个address: : int *copy(int *s, int *t){ : t = s; : return t; : } : 可是我下面的测试,输出1,2,1, 为啥b的值没变啊?但是返回的值c是1,不是说明我的 : copy函数里,t指向的地址已经变成s指向的地址了么? : int main(int argc, char **argv) { : int a =1, b =2 ;
| W*F 发帖数: 3941 | 8 b地址的值是值传递,
b地址本身没改变
【在 h********m 的大作中提到】 : 想写一个函数,传进去两个地址,把第一个的地址赋给第二个,这样两个指针都指向同 : 一个address: : int *copy(int *s, int *t){ : t = s; : return t; : } : 可是我下面的测试,输出1,2,1, 为啥b的值没变啊?但是返回的值c是1,不是说明我的 : copy函数里,t指向的地址已经变成s指向的地址了么? : int main(int argc, char **argv) { : int a =1, b =2 ;
| A******u 发帖数: 30 | 9 考虑到lz能问出这种问题,所以举例用int a=1,b=2也是情有可原。
我觉得实际情况应该是a,b都是两个指针指向两个在heap上的对象,然后传&a,&b进去
不过copy这个函数名暗示了应该是把s的内容复制给t的内容,不应该直接指针赋值啊 | h*******0 发帖数: 270 | 10 貌似楼主没分清引用和指针的区别。。。 你一开始传的是引用,然后函数里面的指针
就指向了a,b。 但是你函数中只是改变了指针的指向,并且这两个指针还是函数的局
部变量。 所以a,b值的本身就没有改变。 指针只是一个存了目标地址的变量, 要把
这个概念搞清楚
【在 h********m 的大作中提到】 : 想写一个函数,传进去两个地址,把第一个的地址赋给第二个,这样两个指针都指向同 : 一个address: : int *copy(int *s, int *t){ : t = s; : return t; : } : 可是我下面的测试,输出1,2,1, 为啥b的值没变啊?但是返回的值c是1,不是说明我的 : copy函数里,t指向的地址已经变成s指向的地址了么? : int main(int argc, char **argv) { : int a =1, b =2 ;
| d******e 发帖数: 2265 | 11 楼主传的地址没错。错的是指针是copy过去的。改变的是copy后的局部变量。
【在 h*******0 的大作中提到】 : 貌似楼主没分清引用和指针的区别。。。 你一开始传的是引用,然后函数里面的指针 : 就指向了a,b。 但是你函数中只是改变了指针的指向,并且这两个指针还是函数的局 : 部变量。 所以a,b值的本身就没有改变。 指针只是一个存了目标地址的变量, 要把 : 这个概念搞清楚
| h**d 发帖数: 630 | 12 正解
★ 发自iPhone App: ChineseWeb 7.8
【在 d******e 的大作中提到】 : 楼主传的地址没错。错的是指针是copy过去的。改变的是copy后的局部变量。
| s******o 发帖数: 78 | |
|