初学C指针 心得(下)

        既然已经了解了什么是指针之后,那我们就来看另一种更高级的形式:将指针变量放到形参中会怎么样?因为形式参数作为被调函数中的组成部分,它是先在内存中开辟了一个存储单元,然后采取“拿来主义”,将实参的内容传递给形参数。接下来是指针变量作为形参的示例代码:

代码一:

#include<stdio.h>
int main()
{
    void swap(int * p1,int * p2);
    int a,b;
    int * x1,* x2;
    printf("please enter a and b:\n");
    scanf("%d%d",&a,&b);
    x1=&a;
    x2=&b;
    if(a<b) swap(x1,x2);
    printf("max=%d,min=%d\n",a,b);
    return 0;
}
void swap(int * p1,int * p2)
{
    int temp;
    temp=*p1;
    *p1=*p2;
    *p2=temp;
}
    

为了更好地体现指针作为形参的含义,下面给出代码二:

#include<stdio.h>
int main()
{
    void swap(int * p1,int * p2);
    int a,b;
    int * x1,* x2;
    printf("please enter two integer numbers:\n");
    scanf("%d%d",&a,&b);
    x1=&a;
    x2=&b;
    if(a<b) swap(x1,x2);
    printf("max=%d,min=%d\n",*x1,*x2);
    return 0;
}
void swap(int * p1,int * p2)
{
    int *p;
    p=p1;
    p1=p2;
    p2=p;
}

然而我们输入一个  4和5 进去时,这两个代码的输出却不相同。代码一输出的是

max=5,min=4

但是代码二输出的却是:

max=4,min=5

显然,虽然两者代码相差不多,但运行结果却不相同,只有代码一符合我们的要求。

代码一中,swap函数长这样:

void swap(int * p1,int * p2)
{
    int temp;
    temp=*p1;
    *p1=*p2;
    *p2=temp;
}

它的意思是先在内存中开辟两个存指针变量的空间,是指针p1与p2,然后由于x1,与x2,分别指向了&a和&b,所以p1与p2也分别指向了&a与&b。在swap函数起作用时,其实全程都不关x1与x2的事,它们两个在一边歇着,而且此函数是一个空函数,所以也没有返回值。

在(上)中我们已经知道了*p的含义了,这代码中的意思就是将a,b地址下的内容给改变了,交换了两个地址下的内容,所以在主函数中输出a,b的时候,它们地址下的内容都改变了,所以输出就变化了,因为此时p1与p2仍然分别指向a,b,所以输出*p1,*p2时也是改变了。

再看代码二中的swap函数:

void main(int * p1,int * p2)
{
    int *p;
    p=p1;
    p1=p2;
    p2=p;
}

此swap函数中,第一步仍然是先在地址中找两个存储单元,用来存p1与p2,然后p1指的地址与x1的相同,p2指的地址与x2的相同,后面就全程没有x1和x2什么事情了。

所以p1就指到&a,p2指到了&b。接下来的操作就是让p1与p2指的地址进行交换,变成了p1指到&b,p2指到&a。

因为全程对x1,x2,a,b都没有进行改动,所以输入4和5,结果只会原封不动的输出。

用图示来表示就是

 相信像我一样的初学者通过我个人的理解,应该可以对指针有了一个更清晰的掌握,初学者在编写程序时也可以更灵活地运用指针。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只intp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值