zoukankan      html  css  js  c++  java
  • Android JNI编程(三)——C语言指针的初步认识、指针变量、互换两个数、函数返回多个值

    目录(?)[+]

    一.什么是指针?

    简单来说: 指针就是内存地址      内存地址就是指针。来看个小案例

    #include<stdio.h>
    #include<stdlib.h>
    /**
      指针就是内存地址
      内存地址就是指针
     */
    main() {
        //定义一个int类型的变量i,并且赋值为10
        int i=10;
        //定义一个int类型的一级指针变量p
        int* p;
        //把i对应的地址给p变量 
        p=&i;
    
        //指针取值*p:把p变量地址对应的值取出来
        printf("*p=%d
    ",*p);
        //打印地址值
        printf("p的地址值%#x
    ",p); 
    
        system("pause");
    }

    这里写图片描述

    总结:p保存的是一个地址值,而*p就是去取地址值所对应的值。

    二.下面通过四个小案例来加深对指针和指针变量的理解,我们先说一下指针和指针变量的区别:

    1. 指针就是内存地址,内存地址就是指针
    2. 内存地址就是内存单元的编号
    3. 指针变量就是存放内存地址的变量
    4. 指针和指针变量是两个完全不同的概念

    1.第一个例子,如果修改i的值,p值有变化吗?

    #include<stdio.h>
    #include<stdlib.h>
    
    main() {
        int i=100;
        //p就是我们的指针变量,存放地址值
        int *p=&i;
        printf("i值修改之前,p的地址值是%#x
    ",p);
        i=200;
        printf("i值修改之后,p的地址值是%#x
    ",p);
    }

    这里写图片描述

    答案是没有变化的:因为此时修改了i值,p引用的还是i的地址所以p不会有变化

    2.第二个例子,如果修改p的值,i值有变化吗?

    #include<stdio.h>
    #include<stdlib.h>
    
    main() {
        int i=100;
        int *p=&i;
        printf("p值修改之前,i的值是%d
    ",i);
        int j=200;
        p=&j;
        printf("p值修改之后,i的值是%d
    ",i);
    }

    这里写图片描述

    答案是没有变化的:因为此时将j的地址给了p,而i并没有动所以i的值不变

    3.第三个例子,如果修改i的值,*p值有变化吗?

    #include<stdio.h>
    #include<stdlib.h>
    main() {
        int i=100;
        int *p=&i;
        printf("i值修改之前,*p的值是%d
    ",*p);
        i=200;
        printf("i值修改之后,*p的值是%d
    ",*p);
    }

    这里写图片描述

    答案是有变化的:因为此时修改了i值,*p引用的是i的地址指向的值,所以*p的值发生了改变

    4.第四个例子,如果修改*p的值,i值有变化吗?

    #include<stdio.h>
    #include<stdlib.h>
    
    main() {
        int i=100;
        int *p=&i;
        printf("*p值修改之前,i的值是%d
    ",i);
        *p= 200;
        printf("*p值修改之后,i的值是%d
    ",i);
    }

    这里写图片描述

    答案是有变化的:因为*p=200;此时是将*p引用的值修改为200,也就是修改了i的值。

    三:”*”号的三种含义

    1. 数学运算符:3 * 7 = 21
    2. 定义指针变量:int* p;
    3. 指针运算符(取值):*p表示取p对应内存地址对应的值

    四:操作内存地址实现将两个数进行互换

    1.第一种:使用中间变量来互换,这一种也是我们最常用的一种方法

    #include<stdio.h>
    #include<stdlib.h>
    /**
        互换两个数
     */
    main() {
        int a = 100;
        int b = 150;
        //通过一个中间变量来互换
        int temp = a;
        a = b;
        b = temp; 
        printf("a的值:%d
    ",a);
        printf("b的值:%d
    ",b);
    
        system("pause");
    }

    2.第二种:我们知道C语言是可以直接操作内存的,所以我们可以直接来改变a,b两个的内存地址指向的值。

    #include<stdio.h>
    #include<stdlib.h>
    
    /**
        互换两个数
     */
    
    //通过互换两个数的地址值,来互换数字
    void changeAdress(int* a,int* b) {
        //temp取的是指针变量a对应的内存地址的值也就是100
        int temp = *a;
        //把a对应内存地址的值 修改为b对应内存地址的值
        *a = *b;
        //把b对应内存地址的值 修改为temp
        *b = temp;
    }
    
    main() {
        int a = 100;
        int b = 150;
    
        //分别将取a,b的地址
        changeAdress(&a,&b);
        printf("a的值:%d
    ",a);
        printf("b的值:%d
    ",b);
        system("pause");
    }

    这里写图片描述

    五:函数返回多个值

    #include<stdio.h>
    #include<stdlib.h>
    /**
        函数返回多个值
        通过修改指针变量引用的值,达到返回多个值的效果。
     */
    void close(int* a,int* b) {
        *a=0;
        *b=0;
    }
    main() {
        int a=1;
        int b=1;
        //调用函数 
        close(&a,&b);
        printf("a=%d
    ",a);
        printf("b=%d
    ",b);
    
        //是docs窗口停留
        system("pause");
    }

    总结起来其实并不难,互换就是将 a原来指向100改成指向150,将 b原来指向150改成指向100;也就是说a,b的地址并没有改变,改变的是他们的值;好了到这里对指针,指针变量的初步认识就讲完了。

  • 相关阅读:
    移动端解决fixed和input弹出虚拟键盘时样式错位
    JS的面向对象
    js计算两个时间范围间的间隔秒数
    使用js过滤字符串前后的空格
    C#时间格式-摘自http://www.cnblogs.com/xiaogongzhu/p/3825600.html
    [dp/贪心]435. 无重叠区间-----经典问题
    【dp】Leetcode面试题 17.16. 按摩师
    [dp]Leetcode.376.摆动序列
    Leetcode 945 使数组唯一的最小增量
    LeetCode 365.水壶问题
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/6169313.html
Copyright © 2011-2022 走看看