Android For JNI(二)——C语言中的数据类型,输出,输入函数以及操作内存地址,内存修改器
2016-04-14 23:42
645 查看
Android For JNI(二)——C语言中的数据类型,输出,输入函数以及操作内存地址,内存修改器
当我们把Hello World写完之后,我们就可以迈入C的大门了,今天就来讲讲基本的一些数据类型,函数之内的
我们先来看一张传播久远的图片‘
一.各种数据类型介绍
整型
整形包括短整型、整形和长整形。
短整形
short a=1;
整形
一般占4个字节(32位),最高位代表符号,0表示正数,1表示负数,取值范围是-2147483648~2147483647,在内存中的存储顺序是地位在前、高位在后,例如0x12345678在内存中的存储如下:
地址:0x0012ff78 0x0012ff79 0x0012ff7a 0x0012ff7b
数据: 78 56 34 12
定义:用int关键字,举例如下:
int a=6;
长整形
long a=10;
浮点型
浮点型包括单精度型和双精度型。
单精度型
浮点型,又称实型,也称单精度。一般占4个字节(32位),
float a=4.5;
地址:0x0012ff78 0x0012ff79 0x0012ff7a 0x0012ff7b
数据: 00 00 90 40
双精度型
一般占8个字节(64位)
double a=4.5;
地址:0x0012ff78 0x0012ff79 0x0012ff7a 0x0012ff7b 0x0012ff7c 0x0012ff7d 0x0012ff7e 0x0012ff7f
数据: 00 00 00 00 00 00 12 40
字符类型
在各种不同系统中,字符类型都占一个字节(8位)。定义如下:
char c=’a’;
也可以用字符对应的ASCII码赋值,如下:
char c=97;
其实我们可以用一串代码来阐述上面的意思
#include <stdio.h> #include <stdlib.h> main(){ //基本数据类型:char int float long short double signed unsigned int i = 3; char a = 'c'; //int的格式说明符 %d printf("i的值为%d",i); //char的格式说明符 printf ("a的值为%c",a); system("pasue"); //通用输出 system("通用输出%d",sizeof(short)); // char int float long shortd的用法和JAVA类似 //我们提一下signed unsigned //signed:有符号 unsigned 无符号 //举个例子 signed int i = 3; //分正负 unsigned int i2 = 3; //不分正负 //字节长度char 1 int 4 float 4 long 4 short 2 double 8 }
是不是清晰明了了,然而我们也是从JAVA走过来的,这些基本上可以一笔带过了,我们接下来看下C中的函数
二.输出函数
这里我们温习一下上面说到的输出函数
%d - int
%ld – long int
%lld - long long
%hd – 短整型
%c - char
%f - float
%lf – double
%u – 无符号数
%x – 十六进制输出 int 或者long int 或者short int
%o - 八进制输出
%s – 字符串
Int len;
Scanf(“%d”,&len);
因为这个JAVA中没有,所以这里还是要提一下的
//C的数组[]要写在后面 ,而且这个 数组的长度为 8,因为他有一个结束符 \0 char str [] = {'a','n','d','r','o','i','d',}; char str [] = "可以输入"; //9个字节长度
三.输入函数
输入函数大家也不陌生,在JAVA中也有,JAVA的代码一般都是这样的
import java.io.*; public class Test1 { /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); String str = stdin.readLine(); System.out.println(str); } }
这样就可以在控制台输入东西了,但是C就简单多了,上面也提到了一个函数 scanf(“%d”,&len);,我们来看看具体怎么用
#include <stdio.h> #include <stdlib.h> //输入函数 main(){ printf("请输入你的年龄:"); //定义一个变量 int age ; //设置输入的类型为int scanf("%d",&age); printf("你的年龄为:%d\n",age); system("pause"); }
这样我们来运行一下:
这样就OK了
四.内存地址
内存这一块,C是可以直接去操作的,这就是他的优势,同时也是他比较难的一块了,我们要好好的磨一磨了,内存地址就是内存的地址,内存中所以数据都是通过地址拿到的,就像findviewbyid一样,我们来看个例子
#include <stdio.h> #include <stdlib.h> main(){ int i ; //当i声明的时候,内存中开辟一个空间,四个字节,无值,分配一个地址 i = 5; //给地址一个值 printf("%d\n",i); //当我们要输出这个i的时候其实是通过地址拿到这个5的 //获取内存地址 printf("%#x",&i); //让窗口停留 int age ; scanf("%d",&age); }
我们通过这行代码来获取i的值以及i的地址,打印的结果
我们为了更形象的说明,打个比方,比如电脑的系统有32和64位区分,32位的系统最大支持的是4G内存,这是因为32位的系统内存总线的长度为32,也就是可以分配给内存作为地址的数字是2的32次方个
五.内存修改器
修改内存,就像打游戏一样,你的血量为100,其实就是在内存中定义一个变量,比如int blood = 100,这个blood在内存中开辟一个空间,赋值为100,然后再进行其他操作,我们写个小例子
#include <stdio.h> #include <stdlib.h> main(){ //时间为60s过关 int time = 60; int i ; //打印i的地址 printf("%#x\n",&i); for(i = time;i>=0;i--){ printf("剩余时间为%d\n",i); //睡眠,达到递减的效果 sleep(1000); } //让窗口停留 int age ; scanf("%d",&age); }
逻辑应该看得懂吧,我们定义一个i,然后获取他的内存地址,再让他进行倒计时一样的操作,这就模拟了打游戏,比如一分钟通关之内的游戏,我们修改i的内存,达到内存修改器的效果
然后我们就可以下载Cheat Engine,这个是内存修改器,和八门神器的原理差不多
下载地址自己去网上找吧,具体的用法,大家可百度
当我们把内存冻结了之后
你就达到了修改游戏的效果了,永远不会到0,也就不会死了,这里也只是阐述一个原理哦!
似乎节奏越来越快了,下节我们学习下指针,这样就会对C有一个清晰的认识了,早点把这块学完,对自己也是有莫大的好处的!
相关文章推荐
- C++中负数的位操作
- C++中负数的位操作
- 面向对象课程 - 寒假第四次作业 - C++计算器项目计算部分
- C/C++ 进阶 —— 指向指针的指针
- neuq oj1063: 谭浩强C语言(第三版)习题8.3 求素数 C++
- c++容器和适配器
- C++实现链表常见面试题
- 【C++】日期类
- vector清空
- 10个C语言常见未定义与执行结果
- 你说你会C++? —— 智能指针
- C++中static 用法总结
- C++第三次作业
- C++Primer 第五版 (课本习题答案)
- 关于c++中的模板
- C语言 随机数的简单研究
- 使用C++ 标准库 stringstream实现各种数据类型之间的转换
- 稀疏矩阵的加法(用十字链表实现A=A+B)
- C++编程基础笔记章节二
- 复杂链表的复制