android ndk-01(基础知识与c语言指针入门)

129 阅读4分钟

NDK是什么?

  • 1.定义:Native Development kit,是android工具开发包
  • 2.作用:快速开发c、c++的动态库,并自动将so和应用一起打包成apk
  • 3.提供了把.so和.apk打包的工具
  • 4.提供了交叉编译器,用于生成特定cpu平台动态库
  • 5.提供了native的支持
优点:
  • 运行效率高
  • 代码安全性高
  • 功能扩展性好
  • 易于代码复用和移植

c语言中指针就代表地址。

//代码
int main() {
    printf("Hello, World!\n");

1.     int num = 999;
2.     int *num_p = #
3.     int **num_p_p = &num_p;

    printf("num_p的值时:%p,num_p_p的值是:%p\n", num_p, num_p_p);
    printf("获取到最终的值时:%d\n", **num_p_p);
    return 0;
}

//看下输出
Hello, World!
num_p的值时:0x16bbdf288,num_p_p的值是:0x16bbdf280
获取到最终的值时:999

未命名绘图.drawio.png

  • 代码1:赋值999.
  • 代码2:将num的地址给指针num_p
  • 代码3:将num_p的地址给双重num_p_p
%p表示输出变量的地址
&表示取得变量的内存地址
%d表示输出值。**num_p_p,
第一个*表示输出变量的值,此时是2000H,第二个*表示获取2000H的值,
是1000H,输出值就是1000H所对应的内存地址的值,就是999

函数指针:

#include <stdio.h>

void add(int num1,int num2) {
    printf("num1 + num2 = %d\n",(num1 + num2));
}

void mins(int num1,int num2) {
    printf("num1 - num2 = %d\n",(num1 - num2));
}

void opreate(void(*method)(int,int),int num1,int num2) {
    method(num1,num2);
    printf("num1 + num2 = %d\n",(num1 + num2));
}

int main() {
    opreate(add,10,10);
    opreate(add,20,10);
    return 0;
}

未命名绘图.drawio.png

//放下我的代码笔记
int i = 100;
    double d = 200;
    float f = 200;
    long l = 100;
    short s = 100;
    char c = 'd';
    //字符串
    char * str = "Derry";
    // 不是随便打印的,需要占位

    printf("i的值是:%d\n", i);

    printf("d的值是:%lf\n", d); // lf == long float  ==  double

    printf("f的值是:%f\n", f); // f == floot

    printf("l的值是:%d\n", l); // d == 整形

    printf("s的值是:%d\n", s); // s == short

    printf("c的值是:%c\n", c); // c == char

    printf("字符串的值是:%s\n", str); // c == char
    // 基本类型的占用字节数 sizeof获取字节数
    // int 占几个字节 == 4
    // double 占几个字节 == 8
    // char 占几个字节 == 1
    printf("int 数据类型所占的字节数: %d\n",sizeof(int)); //4
    printf("double 数据类型所占的字节数: %d\n",sizeof(double )); //8
    printf("char 数据类型所占的字节数: %d\n",sizeof(char )); //1
    #include <stdio.h> // C99 标准库
    //Java 万物皆对象
    //c C++(对象) 万物皆指针
    //Linux 万物皆文件
    //指针 == 地址
    // %p == 地址输出的占位
    // & == 取出地址
    int number1 = 100000;
    printf("此number1变量的地址是:%p\n", &number1);  // 此number1变量的地址是:0x16f087568
    return 0;
}
    //指针难度高一点
    int number_int = 100;
    double number_double = 200;
    printf("number_int的值是:%d\n",number_int);
    printf("number_double的值是:%lf\n",number_double);
    /**
    *number1的地址是0x16f297458
    *number_int的值是100
    *number_double的值是200.000000
    */
    //* == 取出number_int地址对应的值 == 100
    // 指针取出值
    // 既然任何变量都是地址,可以使用都在获取值(灵感)

    printf("number_int的值是:%d\n",*(&number_int));

    printf("number_double的值是:%lf\n",*(&number_double));
    // ==============  难度
    int * intP = &number_int;
    double * doubleP = &number_double;
    //输出100 和 200
    printf("number_int的值是:%d\n",*intP);
    printf("number_double的值是:%lf\n",*doubleP);
    /**
     * 大道至简
    * 内存地址 == 指针
     * 指针 == 内存地址
     * int * double * (int类型指针)
     *
     * 指针别名,指针变量 == 就是一个变量而已 只不过是指针的变量
     */
//通过 指针(地址)修改值
int main(){
    int i = 100;
    // p:我只是接受地址,你给我100,不规范
    // int * p = &i;
    int * p = &i;
    i = 200;
     printf("i的值是:%d\n", i);
     *p = 300// i的值是:300  * p 代表i的地址
     printf("i的值是:%d\n", i);
     return 0;
}
#include <stdio.h>
void change(int *i); // 先声明
// 函数 去修改一个数(指针操作)

int main(){

    int i = 100;

    change(&i);
    
    printf("%d\n", i);

    printf("%p\n", &i);

    return 0;

}
//函数不能写在main下面
void change(int *i){
    *i = 200;
    printf("%p\n", &i);
}//实现
#include <stdio.h>
//只接收指针(内存地址) 内存地址 == 指针
void change1(int * a,int * b){
    int temp = *a;
    *a = *b;
    *b = temp;
}

int main(){
    int a = 100;
    int b = 200;
    change1(&a, &b);
    printf("交换完成后的效果:%d,%d\n",a,b);
}