C语言指针学习六

下面通过交换两个数的值的例子比较,程序代码在最下面,加深对指针变量的理解 

swap1函数
①main主函数a的值3,b的值5传递到是swap1,
swap1的局部变量p, q虽然在做值3和5 的交换,
可是一旦交换完毕,局部变量p和q所占用的内存空间会释放掉。
②主函数main中的a, b仍然没有被改变。
swap2函数

①main函数中a和b的地址分别传递给p, q.
swap2做的是两个地址值的传递,被新赋给的两个地址值交换,
但是无法将main程序中a的地址更换为b的地址,
b的地址更换为a的地址。任何程序都无法做到

②所以a的值没有变,b的值没有变
swap3函数

①main函数中a和b的地址分别传递给p, q.
此时*p将完全相当于a, 因为p的地址是a的内存地址,
*在这里是&的你运算,这样*q就完全等同与b
在swap3中交换*p和*q就完全等同于交换main函数中的a和b.

①一旦一个指针变量被赋予了某个普通变量的内存地址,指针变量就指向了这个普通变量
②这个指针变量指向了这个普通变量,则修改指针变量,不影响该普通变量
同样这个时候修改普通变量也不影响指针变量。
③*指针变量完全等同于该普通变量。
④另外需要说明的是变量的本质就是内存
⑤普通变量(相对与指针变量而言,即非指针变量)一旦被定义,其内存地址无法被改变,如main函数中的a, b

交换变量值的经典程序

#include <stdio.h>

void swap1(int p, int q)
{
    int t;

    t = p;
    p = q;
    q = t;

    return;
}

void swap2(int * p, int * q)
{
    int * t;

    t = p;
    p = q;
    q = t;

    return;
}

void swap3(int * p, int * q)
{
    int t;

    t = *p;
    *p = *q;
    *q = t;

    return;
}

int main()
{
    int a = 3;
    int b = 5;

    printf("==========The first call swap1============\n");
    printf("before swap1(a, b),   a = %d, b = %d\n", a, b);
    swap1(a, b);
    printf("after  swap1(a, b),   a = %d, b = %d\n", a, b);

    printf("==========The second call swap2===========\n");
    printf("before swap1(&a, &b), a = %d, b = %d\n", a, b);
    swap2(&a, &b);
    printf("after  swap1(&a, &b), a = %d, b = %d\n", a, b);

    printf("==========The third call swap3============\n");
    printf("before swap3(&a, &b), a = %d, b = %d\n", a, b);
    swap3(&a, &b);
    printf("after  swap3(&a, &b), a = %d, b = %d\n", a, b);

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值