考虑以下程序:
void f2 ( int * a, int * b) {
int c;
c = * a;
*a = *b;
*b = c;
}
int main () {
int a = 4, b = 5, c = 6;
f2 (&b, &c);
printf ("%d", c - a - b);
}
在这里,b
和c
的值已交换。
和另一个代码是:
# include <stdio.h>
void mystery (int *ptra, int *ptrb) {
int *temp;
temp = ptrb;
ptrb = ptra;
ptra = temp;
}
int main () {
int a = 2016, b=0, c= 4, d = 42;
mystery (&a, &b);
if (a < c)
mystery (&c, &a);
mystery (&a, &d);
printf("%dn", a);
}
在这里,尽管存在相同类型的函数调用,但是main()
程序中任何变量的值都不会更改。
我们知道,C代码中没有参考。因此,我的问题是,尽管两个程序中都有相同类型的函数调用,但为什么一个人交换变量值而另一个人不能交换?
?在第二个程序中,指针交换意味着地址也是交换。正确的??但这不会影响价值。在第1个程序中,地址和指针被交换,并且在平均时间值时值也交换了。但是为什么??
我也想知道,在逐个值的情况下,可以更改main(或不带有返回功能(的值
在第二个程序中,指针是交换意味着地址也是 交换。正确的??但这不会影响价值。在第一个程序中 ,地址和指针被互换,并在同一时间值中值 交换。但是为什么??
因为
void mystery (int *ptra, int *ptrb) {
int *temp;
temp = ptrb;
ptrb =ptra;
ptra = temp;
}
上面的程序交换了ptra
和ptrb
的内容,而不是ptra
和ptrb
指向的对象的内容,因为ptra
和ptrb
是mystery
函数本地的。
要以图像表示。
考虑a
和b
存储在地址100
和200
。
mystery (&a, &b);
呼叫。
ptra
将通过将100
存储到其中指向a
。和ptrb
将通过将200
存储到其中。
b
。 ptra 100
+-----+ +---+
| 100 | | 1 |
+-----+ +---+
ptrb 200
+-----+ +---+
|200 | | 2 |
+-----+ +---+
功能完成执行时。
ptra
将通过将200
存储到其中指向b
。ptrb
将通过将100
存储到其中指向a
。
ptra 100
+-----+ +---+
| 200 | | 1 |
+-----+ +---+
ptrb 200
+-----+ +---+
|100 | | 2 |
+-----+ +---+
在第一个程序中的f2
中,指针是 rederected 更改这些指示器指向的内容,以便修改了main
函数中的b
和c
。相反,第二个程序中的mystery
仅交换本地变量ptra
和ptrb
的值,该变量对main
中的变量没有影响。
所以:
ptrb = ptra;
分配了一个指针到另一个指针的值(这两者都是 msytery
本地的(,而这是:
*a = *b;
将一个指针指向的值的值更改为另一个指针指向的值,即a
和b
中的CC_38。
另一种考虑这一点的方式是与房屋及其居民一起:
______ _____ ______ ______
/______ /______ /______ /______
2 |Smith | 4 |Jones | 6 | Bond | 8 | Solo |
-------- -------- -------- --------
第一个程序是说"交换两个房屋的居民":
______ _____ ______ ______
/______ /______ /______ /______
2 |Smith | 4 | Bond | 6 |Jones | 8 | Solo |
-------- -------- -------- --------
第二个说"交换房屋上的数字"时:
______ _____ ______ ______
/______ /______ /______ /______
2 |Smith | 6 |Jones | 4 | Bond | 8 | Solo |
-------- -------- -------- --------
在第一个片段中,您更改了此函数范围中不局部的对象的值 - 在主机中定义并由这些指针引用。
在第二个中,您会更改局部变量,该变量在离开功能时停止存在。