指针在c和c程序中

时间:2010-04-08 14:49:50

标签: c pointers

我正在研究指针,我遇到了这个程序:

#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个字节以及各种应用程序的使用和指针的优点......

3 个答案:

答案 0 :(得分:5)

你是对的:C中的函数不能直接影响调用者中的值。但是,swap()给出的值不是ab的值。相反,它们是指向这些值的指针 - 基本上是内存中ab存在的地址。由于swap具有这些地址,因此它可以写入这些内存位置并有效地更改ab

顺便说一句,祝你好运。如果你来自没有它们的上下文,那么获取C是最困难的事情。我是通过Perl来到C的,我几次用指针打破了我的大脑。但是一旦你了解它,它就会打开一个全新的世界。

答案 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中的指针(这是传递的内容),但它正在更改指针引用的内容。