Android 下 JNI 开发Day1

5、指针的深入理解-18

1_如何用基本类型的指针

#include<stdio.h>

#include<stdlib.h>

/*

指针的深入理解

*/

main()

{

      int i = 333;      

      int* p ;      

      p = &i;//把i变量的地址赋值给p指针变量   

      //实验1:

      //p的值会影响i的值吗?不会影响

      printf("修改前:i=%d\n",i);

      int j = 123;

      p = &j;

      printf("修改后:i=%d\n",i);      

      system("pause");   

}

   实验2:

    //修i的值会影响p的值吗?不会影响

     //p对应的是地址值,输出需要用,%x,%#x           

      printf("修改前:p=%#x\n",p);

      i = 123;     

      printf("修改后:p=%#x\n",p);

 //实验3

      //修改i的值会影响*p的值吗? 会影响

       printf("修改前:*p=%d\n",*p);

       i = 123;     

       printf("修改后:*p=%d\n",*p);

//实验4

       //修改*p的值会影响i的值吗?

       printf("修改前:i=%d\n",i);

       *p = 99;     

       printf("修改后:i=%d\n",i);

2_指针和指针变量的关系

指针就是地址,地址就是指针

地址就是内存单元的编号

指针变量是存放地址的变量

指针和指针变量是两个不同的概念

但是要注意: 通常我们叙述时会把指针变量简称为指针,实际它们含义并不一样

指针里存的是100,  指针: 地址

指针里存的是地址, 指针: 指针变量

3_为什么使用指针

   指针的重要性

   直接访问硬件 (opengl 显卡绘图)

   快速传递数据(指针表示地址)

   返回一个以上的值(返回一个数组或者结构体的指针)

   表示复杂的数据结构(结构体)

   方便处理字符串

   指针有助于理解面向对象

4_*号的三种含义

*号的含义

数学运算符:  3 * 5

定义指针变量:  int *  p;

指针运算符(取值):  *p (取p的内容(地址)在内存中的值)

知识拓展:

介绍内存,内存编号就是地址,内存分很多单元,每个单元对应一个编号. 介绍地址,内存单元的编号,

为什么电脑4G内存只显示3G

0开始的非负整数.

0000~FFFF

XP操作系统 为什么只能显示3G内存。

常用的XP系统都是32位的系统,就是说在所有程序(包括)系统本身运行的时候,最多能使用232次方的地址,大家可以自己算一下232次方就是4G,但问题是,系统里面除了内存还有其它设备啊,显卡硬盘之类的都是需要地址的,所以,留给内存使用的地址只有3G多一点,剩下的要保留给其它设备。

指针就是地址. 热身小程序 介绍指针

int * p; //p是变量的名字, int * 表示p变量的数据类型是存放int类型的地址的数据类型

//int * p; 不表示定义了一个名字叫做*p的变量

// int * p; 应该这样理解: p是变量名, int *是数据类型 ,p变量的数据类型是int*

//所谓int * 类型 实际就是存放int变量地址的类型

int i = 3;

p = &i;

/*1. p保存了i的地址, 因此p指向i

  1. p不是i,i也不是p,修改p的值不影响i的值,修改i的值也不会影响p的值
  2. 如果一个指针变量指向了某个普通变量, 则 *指针变量  就完全等同于  普通变量

   例子:

如果p是个指针变量,并且p存放了普通变量i的地址

则p指向了普通变量i

*p 就完全等同于  i

  在所有出现*p的地方都可以替换成i

 在所有出现i的地方都可以替换成*p

      *p 就是以p的内容为地址的变量*/

j = *p;  //等价于 j = i;

printf("i = %d, j = %d\n", i, j);