九、C语言基础
安卓学习笔记
JNI java本地开发接口,是一个协议。
如何使用:
1.Java语言
2.c/c++语言
3.Java jni流程
4.NDK(开发工具)#include //standard input output
#include
这两个就相当于导包!!!
system("pause");//编译运行时暂停窗口查看运行结果public class Hello{//类名一定要与文件名一致!!
public static void main(String[] dd){
system.out.println("hello wq");
}
}
启动cmd...在要编译的文件所在文件夹内按Shift+右键,打开编译窗口,
再javac Hello.java再java Hello即可!!!
c调用Java的Hello#include
#include
main(){
printf("hello from c\n");
system("java Hello");//调用Java代码
system("pause");
}
c的基本数据类型#include
#include
main(){
int i=3;
char c='a';
signed int i=30;
system("pause");
}int :32位,能表示的数字是2的32次方个
最高位用来表示符号位,那么还剩下31位可以表示数值,
所以能表示的数字就是2的31次方个
int 的表示范围:-2的31次方~2的31次方
当最高位是0时,0-2147483647
当最高位是1时,-2147483648~-1
java的基本数据类型长度byte:1
short:2
int:4
long:8
boolean:1
char:2
float:4
double:8
printf("char的长度:%d",sizeof(char));//1
printf("int的长度:%d",sizeof(int));//4
printf("float的长度:%d",sizeof(float));//4
printf("double的长度:%d",sizeof(double));//8
printf("long的长度:%d",sizeof(long));//4
printf("short的长度:%d",sizeof(short));//2
printf("long long的长度:%d",sizeof(long long));//8
C语言输出函数%x :十六进制数
%#x:十六进制数,外带一个Ox(十进制数符号)
char arr[]="吴庆";
printf("%s\n",arr);
C语言输入函数char name[8];
scanf("%s",&name);
内存地址的概念int i=9;printf("%#x\n",&i);
修改的概念工具:cheat Engine!!!
main(){
int i;
for(i=100;i>0;i--){
printf("时间剩余:%d\n",i);
sleep(2000);//睡2秒哈哈
}
system("pause");
}
指针的常见错误int* p;//野指针:没有赋值的指针;
*p=23;//错误
int i=23;
p=&i;
printf("%#x\n",p);
值传递和引用传递引用调用函数要加&。相当于只是起个小名。
返回多个值void function(int* p,int* q)
{
*p+=15;
*q+=15;
}
main(){
int i=10;
int j=20;
function(&i,&j);
//输出i,j都变了。
system("pause");
}
在主函数中获取子函数的地址void function(int** p){//p的值就是mainp地址
int i=3;
printf("i的地址为%#x\n",%i);
*p=&i;
}
main(){
int* mainp;
function(&mainp);
printf("主函数中获取i的地址为%#x\n",mainp);
system("pause");
}
数组入门char arr[]="hello";
&arr=&arr[0]数组地址和第一个元素地址一样。
char* p=&arr;
printf("%c\n",*p);//输出h
printf("%c\n",*(p+1));//输出e
指针长度
指针的长度都是4个字节char* cp;
int* ip;
short* lizhip;
printf("%d\n",sizeof(cp));//输出4
printf("%d\n",sizeof(ip));//输出4
printf("%d\n",sizeof(lizhip));//输出4
堆内存和栈内存的概念
堆内存:后进先出(不连续的内存区域,用链表来表示。)
p=new Person();
栈:由系统自动分配。自动释放。
堆:需要程序员自己申请,并指明大小,在C中用Malloc函数。
char* p=(char*)malloc(10);//14byte(指针占4字节)
在windows下,栈大小是2M。
栈上分配的内存,编译器会自动收回;(静态内存分配)
堆上分配的内存,要通过free来显式地收回,否则会造成内存泄漏。(动态内存分配)
动态内存分配
加入#includemain(){
int i=3;
int arr[10];
int* p=malloc(sizeof(int)*10);
*p=10;
*(p+1)=20;
printf("%d\n",*p);
free(p);
}
学号管理系统
加入#includemain(){
printf("请输入学生人数:");
int count;
scanf("%d",&count);
int* p=malloc(sizeof(int)*count);
//根据学生人数去动态申请堆内存
int i;
for(i=0;i
printf("请输入第%d个学生学号:",i);
scanf("%d",p+i);
}
printf("请输入新增学生人数:");
int newcount;
scanf("%d",&newcount);
p=realloc(p,sizeof(int)*(count+newCount));
for(i=count;i
printf("请输入第%d个学生学号:",i);
scanf("%d",p+i);
}
for(i=0;i
printf("第%d个学生学号是:%d\n",i,*(p+i));
}
system("pause");
}
多级指针int i=2;
int* p=&i;
int** q=&p;
int*** l=&q;
printf("i的值为%d\n",*p);
printf("i的值为%d\n",*(*q));
printf("i的值为%d\n",*(*(*l)));
结构体的定义
include
includevoid study(){
printf("吃饭睡觉打李志\n");
}
//定义一个结构体
struct student{
int age;
int height;
char sex;
//结构体中不能定义函数,但可以定义函数指针
void (*studyP)();
}
main(){
//定义结构体的变量
struct student st = {20, 180, 'm', study};
printf("%d\n", st.age);
printf("结构体的长度%d\n", sizeof(st));
//调用函数指针有三种写法
st.studyP();
struct student* stp = &st;
(*stp).studyP();
stp->studyP();
system("pause");
}
联合体#include
#include
main(){
//定义一个联合体
union{long long i; short s; char c} un;
un.i = 3;
printf("%d\n", un.i);
printf("联合体的长度%d\n", sizeof(un));
system("pause");
}
枚举& 自定义类型
includeenum WeekDay
{
Monday = 10,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday
};
int main(void)
{
//int day;
enum WeekDay day = Sunday;
printf("%d\n",day);
system("pause");
return 0;
}
#include
#include
typedef int haha;
main(){
haha i = 3;
printf("%d\n", i);
system("pause");
}