我正在研究指针,我遇到了这个程序:
#include <stdio.h>
void swap(int *,int *);
int main()
{
int a=10;
int b=20;
swap(&a,&b);
printf("the value is %d and %d",a,b);
return 0;
}
void swap(int *a,int*b)
{
int t;
t=*a;
*a=*b;
*b=t;
printf("%d and%d\n",*a,*b);
}
任何人都可以告诉我为什么这个主函数返回值反转?到目前为止我理解的是C中的函数调用不会影响main函数及其值。
我还想知道指针变量占用的空间大小占用了2个字节以及各种应用程序的使用和指针的优点......
答案 0 :(得分:5)
你是对的:C中的函数不能直接影响调用者中的值。但是,swap()
给出的值不是a
和b
的值。相反,它们是指向这些值的指针 - 基本上是内存中a
和b
存在的地址。由于swap
具有这些地址,因此它可以写入这些内存位置并有效地更改a
和b
。
答案 1 :(得分:2)
您正在将a和b的地址传递给swap函数,该函数有两个指针,现在指向a和b。 a的值存储在int t中。然后将b的值存储在a中,并将存储在a(现在为t)中的值设置为b。
一旦函数完成,值就会被交换,因此主要的变化。
如果您要传递a的实际值,而b则交换而不是地址,您将注意到在返回main时没有任何变化。这是指针的强大功能,并将变量的地址设置为指针。
指针现在可以改变变量的值,因为它有它的地址。可以把它想象给你的邻居一把钥匙。你的邻居现在可以进入你的房子并改变你家里任何东西的安排,因为他/她有钥匙(变量的地址)。没有钥匙,邻居不能进入你的房子(通过价值传递的例子),没有钥匙就不能对房子做任何安排。
画出他们通常有帮助的照片。这是关于stackoverflow的一个很棒的解释:
What are the barriers to understanding pointers and what can be done to overcome them?
链接中给出的示例不是直接用于C / C ++,但它可以应用于任何可能支持通过指针/地址更改值的语言。
答案 2 :(得分:1)
该函数接收所传递内容的副本(又名“按值传递”),因此它不会影响传递内容的原始内容。在这种情况下,传递的是指针。该函数不会更改main中的指针(这是传递的内容),但它正在更改指针引用的内容。