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

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

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;
}

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

时间: 2024-10-15 20:21:22

复习:一个指针交换数值的函数的疑惑的相关文章

一个完整的使用成员函数指针的例子

Screen.h #ifndef SCREEN_H #define SCREEN_H #include <string> class Screen { public: typedef std::string::size_type pos; // Action is a type that can point to a member function of Screen // that returns a reference to a Screen and takes no arguments

2、函数内部属性 arguments是类数组对象,主要用途是保存函数参数,但这个对象中有一个名叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数

例如:(1).function factorial(num){ if(num<=1){ return 1; }else{ return num*factorial(num-1); } }//此时是递归算法 var trueFactorial=factorial;//将factorial复制给trueFactorial factorial=function(){ return 0; }//覆盖factorial函数 alert(trueFactorial(5));//0;因为辞职factorial

利用指针函数编写一个求子字符串的函数

#include<stdio.h> #include<string.h> #include<malloc.h> //定义一个指针型函数substr char *substr(char *dest,char *src,int begin,int len) { int srclen=strlen(src);                 //取源字符串长度 if(begin>srclen||!srclen||begin<0||len<0) dest[0]

实现一个数值加法函数,返回两个数字的和。要求能进行参数验证,若参数不是数字或为空则抛出异常。

<body> <script type="text/javascript"> function Sum(arg1,arg2){ //数值加法函数 var sarg1 = new String(arg1); //将传入的参数转为字符串以便进行参数检查 var sarg2 = new String(arg2); //将参数2转为字符类型 if( (sarg1=="")||(sarg2=="") ) //确保参数不为空 { va

《Effective C 》资源管理:条款25--考虑写出一个不抛出异常的swap函数

条款25考虑写出一个不抛出异常的swap函数 条款25:考虑写出一个不抛出异常的swap函数 swap是STL中的标准函数,用于交换两个对象的数值.后来swap成为异常安全编程(exception-safe programming,条款29)的脊柱,也是实现自我赋值(条款11)的一个常见机制.swap的实现如下: namespace std{ template<typename T> void swap(T& a, T& b) { T temp(a); a=b; b=temp;

异或交换数值的分析

异或(^) 跟 按位与(&).按位或(|) 一样是一个位运算符,运算速度自然是很快的. 一般的,它似乎没什么用途.我所知道的它最多就用来加加密,用来交换数值.这里说说使用异或交换数值的一些利弊. 优点: 不需要使用中间变量 一般的交换a,b的值,是使用第三方变量temp temp = a; a = b; b = temp; 可是有一天突然发现了有异或交换数值的方法,这个方法不需要使用第三方变量 a = a ^ b; b = a ^ b; a = a ^ b;  这个方法的写法也很简单:复制3行a

指针*和取地址&amp;函数输入使用

函数输入问题: 1 带&和不带& (参数本身还是拷贝一份参数) 2 函数输入指针 #include <iostream> using namespace std; int main( ) { void swap(int *p1,int *p2); //函数声明 int *pointer_1,*pointer_2,a,b; //定义指针变量pointer_1,pointer_2,整型变量a,b cin>>a>>b; pointer_1=&a; //

[图像识别] 1、如何识别一个指针式的时种的时间?

目录 一.算法基本原理 1.图片预处理 2.找表盘 3.找指针 4.指针映射 5.求时间 二.算法流程图 三.程序关键函数说明 1.Canny 2.HoughCircles 3.HoughLines2 4.MyLine类 5.平面几何相关函数 四.运行结果 五.实验中遇到的主要问题及解决方法: 1.在处理速度方面 2.去除其他圆的影响 3.霍夫找到的直线转换为夹角表示的线段 六.实验中的缺陷和不足 一.算法基本原理 时钟识别,顾名思义:就是根据一张带有钟表的图片识别出钟表上所展示的时间.对于这个

jni c语言使用指针交换两个值

#include <stdio.h> //创建传递指针的方法 void swap(int* pi,int*pj){ int temp=*pi; *pi=*pj; *pj=temp; } main(){ int i=5; int j=7; //之前 printf("%d i\n",i); printf("%d j\n",j); int* pi=&i; int* pj=&j; swap(pi,pj); //之后 printf("%d