JNI-C指针语法
最近看阿里的热修复代码时,发现里面基本都是在c层处理,想着以前也考过c2证书,c语言基础还是比较了解,没想到看到一大堆的*&符号的时候,只记得*符号是用于指针,至于指针怎么用的,现已差不多记不得了。想到如果想精通JNI,则必须先对c指针精通,于是再来温故一下C语法里面的指针
为学习c语法先安装了一个eclipse c++版本,然后再安装minGW,配置其环境。就可以很轻松的在里面像学习java一样学习c了。
配置教程:http://blog.csdn.net/sunny2038/article/details/6918602
一定要把mingw32-make.exe 改名成为 make.exe
一定要把mingw32-make.exe 改名成为 make.exe
一定要把mingw32-make.exe 改名成为 make.exe
重要的事情说三遍,我就算没注意看这个,半天在eclipse里面都没找着mingw配置
下面开始学习之旅
指针
每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址。请看下面的实例,它将输出定义的变量地址:
![](https://img.haomeiwen.com/i6029641/6a1ee7642be9e2fc.png)
什么是指针?
指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:
![](https://img.haomeiwen.com/i6029641/efdf4d9aeeaaf3ac.png)
在这里,type 是指针的基类型,它必须是一个有效的 C++ 数据类型,var-name 是指针变量的名称。用来声明指针的星号 * 与乘法中使用的星号是相同的。但是,在这个语句中,星号是用来指定一个变量是指针。以下是有效的指针声明:
![](https://img.haomeiwen.com/i6029641/d7d1c9e4185d6630.png)
示例
![](https://img.haomeiwen.com/i6029641/351b692440461543.png)
输出
![](https://img.haomeiwen.com/i6029641/9d4fcfd58264611e.png)
看打印日志可以看出p存储的是内存地址,这个有点类似于java里面直接对象的toString方法,如果不覆写toString方法,打印的也是对象的内存地址。只不过java里面没有直接打印int类型的地址的方法,内存地址的作用也是操作内存地址指向的那个值,所以基本数据类型似乎拿它的内置地址也没多大作用.
指针的算术运算
指针是一个用数值表示的地址。因此,您可以对指针执行算术运算。可以对指针进行四种算术运算:++、--、+、-。
假设ptr 是一个指向地址 1000 的整型指针,是一个 32 位的整数,让我们对该指针执行下列的算术运算:
![](https://img.haomeiwen.com/i6029641/22818a78d1f41ad5.png)
在执行完上述的运算之后,ptr 将指向位置 1004,因为 ptr 每增加一次,它都将指向下一个整数位置,即当前位置往后移 4 个字节。这个运算会在不影响内存位置中实际值的情况下,移动指针到下一个内存位置。如果 ptr 指向一个地址为 1000 的字符,上面的运算会导致指针指向位置 1001,因为下一个字符位置是在 1001。
递增一个指针
我们喜欢在程序中使用指针代替数组,因为变量指针可以递增,而数组不能递增,因为数组是一个常量指针。下面的程序递增变量指针,以便顺序访问数组中的每一个元素:
![](https://img.haomeiwen.com/i6029641/888ba450e0268f6f.png)
由此可看出数组变量名也是一个指针
C++ 指针数组
![](https://img.haomeiwen.com/i6029641/5ca2a0220da30000.png)
![](https://img.haomeiwen.com/i6029641/0a42041cd73ac11f.png)
C++ 指向指针的指针(多级间接寻址)
![](https://img.haomeiwen.com/i6029641/146d31c9f2fba913.png)
![](https://img.haomeiwen.com/i6029641/962d895ae9a2ae77.png)
传递指针给函数
![](https://img.haomeiwen.com/i6029641/b328cd730682e509.png)
从函数返回指针
![](https://img.haomeiwen.com/i6029641/f0d2e0cf808acc1a.png)
![](https://img.haomeiwen.com/i6029641/1b80852d4f46c02c.png)
![](https://img.haomeiwen.com/i6029641/620f5419e9762bf4.png)
无类型指针void*
![](https://img.haomeiwen.com/i6029641/445c598e15496d33.png)
无类型指针有点类似于Java里面的Object对象。所有指针都可以转换成无类型指针,无类型指针也可以转换为其他类型指针。
函数指针
函数指针是指向函数的指针变量。
通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函数。
函数指针可以像一般函数一样,用于调用函数、传递参数。
函数指针变量的声明:
![](https://img.haomeiwen.com/i6029641/3f63e0a86797e4ca.png)
![](https://img.haomeiwen.com/i6029641/5ce7e0c60a5334a7.png)
参考网址 无类型指针void*的学习与使用:http://blog.csdn.net/playboy_lei/article/details/50560786
网友评论