码迷,mamicode.com
首页 > 其他好文 > 详细

复习:一个指针交换数值的函数的疑惑

时间:2020-01-15 00:06:11      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:print   直接   oid   就是   引用   交换   而且   复习   为什么   

前言:自己思考了下,其实也不知道是不是这样解释的,自己解释了三种情况

1、第一种情况就是直接在主函数中进行地址交换
2、第二种情况就是直接在子函数中进行指针解引用交换
3、第三种情况就是直接在子函数中进行地址交换,这一点就是自己的疑惑点,自己想了下其实主要还是形参实参栈区的原因

#include<stdio.h>
#include<Windows.h>


void swap(int *c, int *d) { //传入的是指针a b 中保存的地址
    //int  *t;
    //printf("%d, %d\n", (int)c, (int)d); // 14154240 14154228
    //t = c;
    //c = d;
    //d = t;
    //printf("%d, %d\n", (int)a, (int)b); // 14154228 14154240

    //主函数main中输出的值不变的原因是,指针c d是形参,接收的是a和b中存储的地址,a和b中存储的地址分别是i和j的地址,接着swap中互相改变了c和d的地址,c和d虽然接收了
    //a和b的地址,而且改变的就是c和d中存储的地址,但是需要注意的是c和d这两个指针是在栈区产生的内存空间,随着函数的调用结束也会消失,主函数中取得还是a和b的指针所以不变。


    //想一下swap中如果取值的时候然后再交换,c和d接收了a和b的地址 是正确的,然后紧接着就是修改了 c和d中指向的地址的值,那么也就是i和j的值 ,所以也是正确的

    //唯一不同的就是一个改变的是指针的地址,一个改变的是指针所指向的地址的变量的值
    
}

int main() {
    int i = 3;
    int j = 5;
    int *a = &i;
    int *b = &j;
    int *t;
    //printf("%d, %d\n", (int)a, (int)b);   // 14154240 14154228
    //printf("%d, %d\n", (int)&a, (int)&b); // 14154216, 14154204
    t = a;
    a = b;
    b = t;
    //这里同样可以解释的清楚,为什么直接在主函数中交换会直接交换相应的值,因为a和b指针存储的就是i和j的地址啊,交换了地址,自然交换了地址所指向的指


    //swap(a, b);
    //printf("%d, %d\n", (int)a, (int)b);
    printf("%d, %d\n", *a, *b);

    system("pause");
    return 0;
}

复习:一个指针交换数值的函数的疑惑

标签:print   直接   oid   就是   引用   交换   而且   复习   为什么   

原文地址:https://www.cnblogs.com/zpchcbd/p/12194416.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!