Home > C

不能企图通过改变指针形参的值而使指针实参的值改变

这句话一直困扰我这很久。不过最近通过gdb终于明白了。

形参就是函数定义与函数说明时带的参数。而实参就是函数调用时给的参数。形参出现在函数定义中,在整个函数体内都可以使用,离开该函数则不能使用。实参出现在主调函数中,进入被调函数后,实参变量也不能使用。形参和实参的功能是作数据传送。

不能通过修改形参的值来修改实参。这句话在普通的数值类型,很容易明白。但是加上了C语言中的指针,就糊涂了。要想明白指针,只要记住一句话就行:指针是保存变量地址的一种数值类型。与其他的类型相比,它保存的是地址而已,没有其他的区别了。

先看代码:

#include
void swap (int *,int *);
int main()
{
        int a,b;
        printf("Input a,b(a,b):");
        scanf("%d,%d",&a,&b);
        printf("The address a,b is %x,%x\n",&a,&b);
        printf("a,b:%d,%d\n",a,b);
        swap(&a,&b);
        printf("a,b:%d,%d\n",a,b);

        return 0;
}
        void swap(int *p1,int *p2)
        {
                int  *swap;
                printf("in function swap\n");
                printf("the value p1 and p2= %x ,%x\n",p1,p2);
                printf("the address p1 and p2= %x ,%x\n",&p1,&p2);
                printf("the  *p1 and *p2= %d ,%d\n",*p1,*p2);

                swap=p1;
                p1=p2;
                p2=swap;

                printf("after swap\n");
                printf("the value p1 and p2= %x ,%x\n",p1,p2);
                printf("the address p1 and p2= %x ,%x\n",&p1,&p2);
                printf("the  *p1 and *p2= %d ,%d\n",*p1,*p2);
        }

运行结果:

Input a,b(a,b):22,222
The address a,b is bfecdb04,bfecdb00
a,b:22,222
in function swap
the value p1 and p2= bfecdb04 ,bfecdb00
the address p1 and p2= bfecdae0 ,bfecdae4
the  *p1 and *p2= 22 ,222
after swap
the value p1 and p2= bfecdb00 ,bfecdb04
the address p1 and p2= bfecdae0 ,bfecdae4
the  *p1 and *p2= 222 ,22
a,b:22,222

a b 的内存地址分别为:0Xbfecdb04,0Xbfecdb00
通过swap函数,a b 的地址传递给 p1,p2。也就是指针p1,p2的值为a,b的内存地址。

接下来是三句赋值语句。改变的只是形参p1,p2的值。p1,p2的值分别为b,a的内存地址。变量a,b的值没有改变。改变的只是p1,p2指向的地址。

请选择你看完该文章的感受:

2不错 1超赞 0无聊 0扯淡 1不解 1路过

随机文章:

Tags: ,

发表评论