序:从事安卓开发也快5年了,上份工作是关于人脸识别的定制化的板子,在工作过程中要用到很多关于linux的知识。了解linux,也就更理解了上层安卓java层的实现。之前遇到需求,执行shell命令,java执行20到30毫秒,严重影响效率,然后有底层的同事提供接口,执行只需要1毫秒,没错,就有这么大的差别。之前就一直想往安卓底层学习,通过上份工作,更对C和C++的产生了浓厚兴趣。和安卓相关的,就从NDK开始了。计划先学C语言,然后C++,然后JNI,最后NDK.感觉废话太多,进入正题
1.结构体的理解:
结构体可以类比为java中的类,但是和java之前存在根本区别:
1.java是属于面向对象,C是属于面向过程,所以结构体不会有面向对象的特性,所以结构体没有继承的概念,即不存在父子类的关系。
2.结构体和java的类的内存分配不同:在java中,基本数据类型(八种:int,char,short,double,long,float,byte,boolean)的内存都分配在栈区,其他非基本数据类型的对象都分配在堆区,栈区只存储该对象的引用。而C语言中的结构体,申明之后,和基本数据类型都有可能存在栈区(使用*alloca()函数动态申请内存时,基本数据类型和其他结构体会存在堆区,需要手动管理内存的申请和释放)。
2.用法:
1.常规用法:定义结构体Student,
struct Student
{
char name[20];
int age;
};
void main(){
struct Student student = { "李红", 12 };
printf("学生的姓名:%s, 年龄:%d\n", student.name, student.age);
system("pause");
}
2.结构体申明时初始化,和初始化指针
struct Student
{
char name[20];
int age;
}peter, *peterP;
void main(){
peter.age = 12;
strcpy(peter.name, "皮特");
printf("学生peter的姓名:%s, 年龄:%d\n", peter.name, peter.age);
peterP = &peter;
peterP->age = 20;
strcpy(peterP->name, "皮特1");
printf("学生peter修改后的姓名:%s, 年龄:%d\n", peter.name, peter.age);
system("pause");
}
3.设置别名,这里说一下,设置别名之后,就可以像其他基本数据类型一样,不需要在前面加上“struct”。
// 格式
typedef struct name{
char name[20];
int sex;
} aligname;
// 示例
typedef struct Teaccher{
char name[20];
int sex;
} Teaccher;
void main(){
Teaccher t;
strcpy(t.name, "张华老师");
t.sex = 1;
printf("老师的姓名:%s, 性别%d\n", t.name, t.sex);
system("pause");
}
4.无名称的结构体(单例)
struct
{
int width;
}World;
void main(){
World.width = 100;
printf("world的宽:%d\n", World.width);
system("pause");
}