其他基本数据类型java有这里就不介绍了
ide:visual studio2013
操作系统:win10 64 bit
从这篇开始 我会记录下我每天学习jni的过程。

ide下载地址:visual studio2013百度云连接

我只是一个初学c(大学学过忘了差不多)Android开发者 想学习jni中。。。文章仓促而成加上自己不成熟错漏在所难免。还请您多多海涵和指明


  • union 介绍
  • enmu介绍
  • 字符串
  • 指针
  • 指针与数组
  • 方法指针
  • 多级指针
  • 输出方法
  • 输入方法
  • 逻辑判断
  • struct结构体
  • 外挂原理

union 介绍:

内部定义一组数据,大小为数据中最大的内存变量决定

代码 :

union MyUnion
{int a;double  c;};

那么如果我们定义Myunion大小为double

案例:

#include <stdio.h>
#include <Windows.h>
union MyUnion
{int a;double  c;};void main(){union MyUnion  data;data.a = 1;printf("double 大小%d\n", sizeof(double));printf("union MyUnion 大小 %d\n", sizeof(data));system("pause");
}

运行结果:

方法说明:
1. void main() 方法启动入口 和java 差不如理解
2. # include 导入头文件XXX.h (相当于java的import 导入包) 但不是不导入实现类
3. # include<stdio.h > 导入标准 输入输出流 std标准的意思 ,io输入输出 ;导入后可以使用 printf 和scanf等函数(后面介绍);
4. # include <Windows.h> windows操作系统头文件 导入后可以使用dos命令;使得其调用system(“pause”);(让其黑窗口不是一闪而过)
5. sizeof() 返回对应变量的字节数 ,编译环境不同返回的大小也不一样


enmu介绍:

和java很类似但是也有不同点 感觉比java好用的多

enum MyEnum
{RED,BLUE,WHITE};

注意:RED默认代表0 其余的默认递增 也就是说 BLUE 代表1 ,WHITE代表2;

enum MyEnum
{RED,BULU,WHILTE};
void main(){enum MyEnum a = BULU;printf("%d\n",a);system("pause");
}

输出:

当然也可以修改枚举默认值

enum MyEnum
{RED =3 ,BLUE,WHITE};

RED=3 之后的枚举默认递增 BLUE = 4 ,WHITE = 5


字符串

C没有java中的String变量 一般用char[] 表示 和char * (指针)表示;注意char 在c里面一个字节。

  1. char[]使用方法
void main(){char astring[3] = {'a', 'b', '\0'};printf("%s\n",astring);system("pause");
}

解释:必须要加一个’\0’否则程序不知道字符串在哪里结束
输出:ab

看一下另一个案例:

    void main(){char astring[] = "asdasd";printf("%s\n",astring);system("pause");}

解释:上面默认会自动加上‘\0’

注意字符数组存字符串 不能直接二次赋值

如下代码汇编错误:

void main(){char astring[] = "asdasd";printf("%s\n",astring);astring = "asd";//报错system("pause");
}

赋值方法:

void main(){char astring[] = "asdasd";printf("%s\n",astring);strcpy(astring, "新的字符串");printf("%s\n", astring);system("pause");}

strcpy函数需要导入#include <string.h>

虽然 char[]不支持二次赋值 但支持 单个字符修改

#include"stdio.h"void main(){char  string[] = "asd";string[0] = 's';printf("%s",string );getchar();}

输出:ssd


2 char* 使用方法

指针 比较灵活的一个方式 且可以直接赋值

#include"stdio.h"void main(){char * string = "asd";string = "met";printf("%s",string );getchar();}

解释:getchar();接收一个字符串这里写的目的是不让黑窗口消失


指针

没有指针就没有c

指针 分很多种 如 int * ,byte * ,struct* 。。。。。

指针的含义:指向某个内存区域

int * 断点案例:

我们先让程序执行到 printf(“”);//此时int a = 3 执行完毕

我们观察下 a 的变量地址

可以看到 a内存地址为 0x0117fae0

然后执行后面全部代码 查看输出

指针访问

修改对应内存数值

void main(){int a = 3;printf("");//断点到这 让程序执行  a  = 3;//获取 a 的地址 保存到p种int * p = &a;printf("a变量地址 %#x\n",p);*p = 5;printf("a的数值: %d\n", a);getchar();}

输出:a :5

*p 表示对应指针保存内存的数值 通过修改其值 可以间接修改变量数值

指针与数组

请看如下代码:

#include"stdio.h"void main(){int a[] = {1,23,45,6};printf("数组a的内存地址 %d\n", &a);printf("数组a[0]的内存地址 %d\n", &a[0]);printf("a变量的值 %d\n", a);printf("*a保存的数值 %d\n", *a);printf("a[0]保存的数值 %d\n", a[0]);getchar();}

输出结果:

结果分析: a完全可以当成一个指向数组第一个元素a[0] 内存地址,a就是一个指针.
那么 *(a+1) = a[1]
tip: a+1 自定偏移四个字节 因为a是int * 类型 加1 偏移int的字节数

所以验证案例如下:

#include"stdio.h"
void main(){int a[] = {1,23,45,6};printf("*(a+1)= %d\n",*(a+1));printf("a[1] 内存地址= %#x\n", &a[1]);printf("(a+1)指向 内存地址= %#x\n", (a + 1));getchar();
}

输出结果:

方法指针

不知道是不是java中接口回调的机制原理

#define _CRT_SECURE_NO_WARNINGS //宏定义让其可以使用scanf#include"stdio.h"#include <stdlib.h>
#include <string.h>int add(int a,int b){return a + b;
}void main(){//int(*fun)(int, int) = add;//方法一int(*fun)(int, int) =&add;//方法二int result = fun(3,3);printf("%d",result);getchar();
}

多级指针

多级指针 包含2级以上指针,这里写下2级指针 其他3级指针大家可以自己尝试下
请看以下案例

# include <stdio.h>void main(){int a = 100;printf("变量a的地址%#x\n",&a);//定义一个一级指针int *p = &a;printf("一级指针p的地址%#x\n",&p);printf("一级指针p保存的变量地址%#x\n", p);printf("一级指针p保存的变量内存地址对应的字面量为%d\n", *p);//定义一个二级指针 存一个1级指针的地址int **p2 = &p;printf("\n");printf("二级指针p2的保存地址%#x\n", p2);printf("二级指针p2保存的一级指针指保存的对应的字面量为%#x\n", *p2);printf("二级指针p2保存的一级指针指向内存地址对应的字面量为%d\n", **p2);getchar();}

输出:

结论: 2级指针是用来保存1级指针的内存地址,p2 输出对应保存对应内存的字面量 (1级指针p保存的内存地址 本例是保存int a地址),**p2输出1级变量保存内存的字面量即 int a的数值大小100;因为*p2可以当成p ,所以*p=(*p2); 数学等量代换

输出方法

我们在java中输出文字在控制台一般是System.out.println方法,而在c中输出方法printf,且需要占位符;

如下:

#include"stdio.h"void main(){char * string = "hello word";char p[] = "hello word";printf("%s\n", string);printf("%s\n", p);getchar();
}

上面的代码输出了两个字符串 。%s就时一个暂未符

那么我们看看c语言的暂未符把 以下列举常用类型

符号 意义
%d 带符号int类型
%s 字符串类型
%c char类型
%f float类型
%lf double类型
%o 八进制
%x 十六进制
%#x 十六进制且开头带有0x
%u 无符号10进制整数

tip:和java一样的格式化输出 %0.2d (保留两位小数 四舍五入)等等

输入方法

从控制台输入数据。
和c语言的输出方法一样 都需要占位符
注意:在visual 2013中 scanf需要加宏定义去取消警告去使用这个API(老API嘛)

#define _CRT_SECURE_NO_WARNINGS //宏定义让其可以使用scanf#include"stdio.h"void main(){printf("请输入一个数:\n");int a =1 ;scanf("%d", &a);printf("输入结果为%d\n",a);getchar();//取消回车键影响getchar();
}

scanf(“%d”, &a); 注意这里有个取地址&

其他输入方法类似:

#define _CRT_SECURE_NO_WARNINGS //宏定义让其可以使用scanf#include"stdio.h"void main(){printf("请输入一个字符串:\n");char a[100] ;scanf("%s",&a);printf("输入结果为%s\n",a);getchar();//取消回车键影响getchar();
}

上面这个不需要取地址符号也行 ,原因:数组符号是个指针 保存内容就时数组首地址

逻辑判断

在java中if()判断依据是boolean 而 c中NULL和0都是false
如:

void main(){if (0){printf("是真");}else{printf("是假");}getchar();
}

输出 : 是真

struct结构体

给我感觉和java的类一样

初始化方式1:

#define _CRT_SECURE_NO_WARNINGS //宏定义让其可以使用scanf#include"stdio.h"#include <stdlib.h>struct MyStruct
{int age;char * name;};void main(){struct MyStruct test1 = {12,"里斯"};printf("我的年龄%d,我的名字%s",test1.age,test1.name);getchar();
}

初始化方式2:

#define _CRT_SECURE_NO_WARNINGS //宏定义让其可以使用scanf#include"stdio.h"#include <stdlib.h>struct MyStruct
{int age;char * name;};void main(){struct MyStruct test1 ;test1.age = 1;test1.name = "金额";printf("我的年龄%d,我的名字%s",test1.age,test1.name);getchar();
}

假如结构体内部字符串是 char[100]的不能用方式2初始化 需要使用strcopy函数
如下:

#define _CRT_SECURE_NO_WARNINGS //宏定义让其可以使用scanf#include"stdio.h"#include <stdlib.h>
#include <string.h>struct MyStruct
{int age;char name[100];};void main(){struct MyStruct test1 ;test1.age = 1;strcpy(test1.name,"asd");printf("我的年龄%d,我的名字%s",test1.age,test1.name);getchar();
}

结构体可以嵌套

如下:

#define _CRT_SECURE_NO_WARNINGS //宏定义让其可以使用scanf#include"stdio.h"#include <stdlib.h>
#include <string.h>struct MyStruct
{int age;char name[100];struct MyStruct2{int aa;};};void main(){struct MyStruct2 test2;test2.aa = 3;struct MyStruct test1;test1.aa = 232;printf("%d\n", test2.aa);//输出3printf("%d", test1.aa);//输出232getchar();
}

外挂原理

假设我们又一款游戏(单机) ,生命值应该是一个变量,我们只需要获取到这个生命值的内存地址,在用指针指向然后修改指针数值即可完成。但是不同程序是不允许直接访问的(win98之前听说可以)。。所以我们只需要把程序生成dll(动态链接库即可),在用注入器注入dll即可

#include <stdlib.h>
#include <stdio.h>__declspec(dllexport) void update(){//修改血量内存地址 这里假设地址是这个int *p = 0x99999999;*p = 999999;
}

//__declspec(dllexport) 固定写法让其动态库能被调用

最后生成dll文件,然后利用dll注入某个游戏 调用我们写的update方法即可

C语言基本变量语法输出和输入方法相关推荐

  1. c语言双精度百分号,C语言输出百分号%的方法和示例

    在C语言中的printf函数族中,百分号%有特别的用途(占位符),不能直接输出. 1.输出百分号%号的方法 如何输出百分号?很简单,用两个%表示输出一个百分号. 示例: /* * 程序名:book.c ...

  2. C语言输出百分号%的方法和示例

    文章目录 1.输出百分号%号的方法 2.获取视频教程 3.版权声明 在C语言中的printf函数族中,百分号%有特别的用途(占位符),不能直接输出. 1.输出百分号%号的方法 如何输出百分号?很简单, ...

  3. C语言switch输入月份输出季节,输入年月,输出月份有几天(分别用了if——else和switch)...

    首先是switch做的 class Program { static void Main(string[] args) {/* 题目要求:请用户输入年份,输入月份,输出该月的天数. 思路:一年中月份的 ...

  4. c语言输入一个小写字母 将其变为大写,c语言输入一个数减32然后输出和输入小写字母变为大写字母有什么区别?...

    匿名用户 1级 2019-03-19 回答 在 C 语言中区分字母的大小写,利用 ASCII 码中大写字母和小写字母之间的转换关系(差值为 32),可以将小写字母转换为大写字母.编写程序实现,从键盘上 ...

  5. ACMNO.21 C语言-逆序输出 输入10个数字,然后逆序输出。 输入 十个整数 输出 逆序输出,空格分开 样例输入 1 2 3 4 5 6 7 8 9 0

    题目描述 输入10个数字,然后逆序输出. 输入 十个整数 输出 逆序输出,空格分开 样例输入 1 2 3 4 5 6 7 8 9 0 样例输出 0 9 8 7 6 5 4 3 2 1 提示 数组?堆栈 ...

  6. c语言中从键盘上输入三个数,将之排序后按由大到小的顺序输出,从键盘上输入3个数,将它们按由大到小的顺序排列好输出...

    vb中从键盘上输入10个数,判断有几个偶数,有几个奇数? 我给你写了,挺简单的.窗体上添加两个label控件一个command控件Dima(1To10)DimbDimcAsIntegerDimdAsI ...

  7. C语言学习之从键盘输入任意一个字母,输出它的对应大(小)写

    C语言学习之从键盘输入任意一个字母,输出它的对应大(小)写 通过键盘随意输入一个大写或小写字母,输出它对应的小写或大写字母,若不是字母则提示"输入有误!" #include < ...

  8. c语言cin输入数组,C++基础:各种输入方法总结cin.get()、

    原标题:C++基础:各种输入方法总结cin.get(). 在C++中,各种输入方法还是不少的,而且各有所异,本文做一点简要总结,主要涉及如下内容:cin.cin.get().cin.getline() ...

  9. (C语言)验证哥德巴赫猜想,输入一个大于6的偶数,输出这个数能被分解为哪两个质数的和

    (C语言)验证哥德巴赫猜想,输入一个大于6的偶数,输出这个数能被分解为哪两个质数的和,如10=3+7,12+5+7. // 质数:除了1和自身,不能被任何数整除的数 #include<stdio ...

最新文章

  1. 管理 Oracle Solaris ZFS 存储池网址
  2. IFTTT 加入开源大家庭,已开源5个项目
  3. XGBoost、LightGBM的详细对比介绍
  4. 某电世界------青龙面板
  5. 关于oracle date类型值0000-0-0的分析
  6. DreamWeaver做ASP 服务器配置篇
  7. 开源NewSQL – CockroachDB在百度内部的应用与实践
  8. linux高级的脚本,【2018.07.23学习笔记】【linux高级知识 Shell脚本编程练习】
  9. android新浪登录接口,新浪游戏AndroidSDK接入文档—服务端.md
  10. 妈蛋:kinMaxShow旋转木马异常,WebUploader图片上传坑爹,图像被压缩
  11. Linux中常用命令(文件)
  12. Windows server DHCP服务器搭建
  13. 2021-06-19:交错字符串。 有三个字符串s1,s2,s3。判断s3是否由s1和s2交错组成的。比如s1=“abc“,s2=“123“,s3=“12ab3c“,应该返回true,因为s3去掉12
  14. 帝国cms登陆表单的制作与变量说明
  15. illustrator cs5 for mac 官方简体中文版 破解
  16. linux系统命令打不出字,常用的命令 linux
  17. c语言中signal函数详细解释说明
  18. 相处模式计算机型,三天内,女朋友;大于三天,电脑:两性相处,“尺寸”很重要...
  19. 计算机网络局域网组建课程设计,计算机网络课程设计 组建校园局域网.doc
  20. 学环境工程我后悔了_十大最烂专业 后悔坑人专业有哪些

热门文章

  1. mxnet 运行自己的数据
  2. Swift 5 Type Metadata 详解
  3. Wyn Enterprise 仪表板组件间联动设置及关闭
  4. 计算机专业有什么劣势,计算机专业的优劣势
  5. 编写测试用例方法----因果图判定表
  6. 作业:摄氏度转化为华摄氏度
  7. docker-compose基本命令使用
  8. 带你轻松写出第一篇优秀论文
  9. Win8.1打开电脑时提示C:\WINDOWS\system32\config\systemprofile\Desktop不可用的解决方法
  10. 关于LInux安装KubeSphere说明