美文网首页
进击的NDK01-基本数据类型和指针

进击的NDK01-基本数据类型和指针

作者: Rc在努力 | 来源:发表于2018-08-22 15:03 被阅读7次
吾心所向,一往无前

NDK

基本数据类型

int short long float double char

int %d
short %d
long %ld
float %f
double %lf
char %c
%x 十六进制
%o 八进制
%s 字符串
void main(){
    //基本数据类型所占的字节数
    printf("int 占 %d 字节\n", sizeof(int)); //4字节
    printf("char 占 %d 字节\n", sizeof(char)); //1字节
    printf("float 占 %d 字节\n", sizeof(float));//4字节

    system("pause");
}

输入输出函数

void main(){
    int i;
    printf("请输入一个整数:");

    //赋值
    scanf("%d", &i);  //控制台输入,&取地址符

    //打印
    printf("i的值为:%d\n", i);

    system("pause");
}

指针

指针存储的是变量的内存地址
内存地址,系统给数据分配的编号

void main(){
    int i = 60;
    //指针变量,创建一个int类型的指针
    int* p = &i;//p的值就是i这个变量的内存地址
    printf("%#x\n", p);

    float f = 89.5f;
    //创建一个float类型的指针
    float* fp = &f;
    printf("%#x\n", fp);


    system("pause");
}

变量名,对内存空间上的一段数据的抽象

void main(){
    int i = 60;
    //创建一个int类型的指针
    int* p = &i;
    //输出地址,两个地址是一样的
    //p指向i的地址
    printf("p的地址:%#x\n", p);
    printf("i的地址:%#x\n", &i);

    //通过指针修改i的值
    *p = 66;

    printf("i的值为:%d\n", i);
    system("pause");

}

指针为什么要有类型?

  • 指针有类型,地址没有类型
  • 地址只是开始的位置,类型读取到什么位置结束
void main(){
    int i = 89;
    //int 类型的指针
    int *p = &i;
    double j = 78.9;
    //赋值为double类型变量的地址
    p = &j;
    printf("double size:%d\n", sizeof(double));
    printf("%#x,%lf\n",p,*p); //想通过4字节读取8字节变量的值,是不行的    

    getchar();
}

NULL空指针

void main(){
    int i = 9;
    int *p = NULL;
    //p = &i;
    
    //空指针的默认值为0
    printf("%#x\n",p);
    //访问内存地址0x000000操作系统不允许
    //p = 100; //操作系统不允许访问
    printf("%d\n",*p);
    getchar();
}

多级指针(二级指针)

指针保存的是变量的地址,保存的这个变量还可以是一个指针变量

void main(){
    int a = 50;
    //p1上保存的a的地址
    int* p1 = &a;
    
    //p2上保存的p1的地址
    int** p2 = &p1;

    //int*** p3 = &p2;

    printf("p1:%#x,p2:%#x\n",p1,p2);
    **p2 = 90;

    printf("%d\n",a);

    getchar();
}

指针的运算

指针的运算,一般在数组遍历时才有意义,基于数组在内存中线性排列的方式

void main(){
    //数组在内存中连续存储
    int ids[] = { 78, 90, 23, 65, 19 };
    //数组变量名:ids就是数组的首地址
    printf("%#x\n",ids);
    printf("%#x\n",&ids);
    printf("%#x\n",&ids[0]);
    //指针变量
    int *p = ids;
    printf("%d\n",*p);
    //指针的加法
    p++; //p++向前移动sizeof(数据类型)个字节
    printf("p的值:%#x\n", p);
    //p--;
    printf("%d\n", *p);
    getchar();
}

通过指针给数组赋值

void main(){
    int uids[5];
    //高级写法
    //int i = 0;
    //for (; i < 5; i++){
    //  uids[i] = i;
    //}
    //早些版本的写法
    int* p = uids;
    printf("%#x\n",p);
    int i = 0; //i是数组元素的值
    for (; p < uids + 5; p++){
        *p = i;
        i++;
    }

    getchar();
}

函数指针

int msg(char* msg,char* title){
    MessageBox(0,msg,title,0);
    return 0;
}
void main(){
    //msg();
    printf("%#x\n",msg);
    printf("%#x\n",&msg);
    //函数指针
    //函数返回值类型,函数指针的名称,函数的参数列表
    int(*fun_p)(char* msg, char* title) = msg;
    fun_p("消息内容","标题");

    getchar();
}
int add(int a,int b){
    return a + b;
}

int minus(int a,int b){
    return a - b;
}

//msg函数需要传递一个函数指针参数
//类似于我们Java中的回调函数

void msg(int(*func_p)(int a, int b), int m, int n){
    printf("执行一段代码...\n");
    printf("执行回调函数...\n");
    int r = func_p(m, n);
    printf("执行结果:%d\n",r);
}

void main(){
    //加法
    //int(*func_p)(int a, int b) = add;
    msg(div, 10, 20);
    //减法
    //msg(minus,50,10);
    getchar();
}
//案例:用随机数生成一个数组,写一个函数查找最小的值,并返回最小数的地址,在主函数中打印出来
int* getMinPointer(int ids[], int len){
    int i = 0;  
    int* p = &ids[0];
    for (; i < len; i++){
        if (ids[i] < *p){           
            p = &ids[i];
        }
    }
    return p;
}

void main(){
    int ids[10];
    int i = 0;
    //初始化随机数发生器,设置种子,种子不一样,随机数才不一样
    //当前时间作为种子 有符号 int -xx - > +xx
    srand((unsigned)time(NULL));
    for (; i < 10; i++){
        //100范围内
        ids[i] = rand() % 100;
        printf("%d\n", ids[i]);
    }

    int* p = getMinPointer(ids, sizeof(ids) / sizeof(int));
    printf("%#x,%d\n",p,*p);
    getchar();
}

指针与数组的几种写法

void main(){
    int a[] = { 78, 34, 73, 25, 80, 90 };
    int i = 0;
    for (; i < 6; i++){
        printf("%d,%#x  ", a[i], &a[i]);
        //a首地址
        //a 等价于 &a[0] ,a+1 等价于&a[1] 
        //结论: a+i 等价于 &a[i]
        //*a等价于 a[0],*(a+1)等价于a[1]
        //结论: *(a+i)等价于a[i]
        printf("%d,%#x  ", *(a + i), a + i);

        printf("\n");
    }
    //总结:
    //a+i 等价于 &a[i],*(a+i)等价于a[i],后者只是简写方式,在最古老的C语言里是没有中括号的

    //另外一种写法
    printf("\n\n");
    int* p = a;
    //p变量指针,a常量指针
    //p = &i;
    //a = &i; 不行
    i = 0;
    for (; i < 6; i++){
        //a[i]表达式:首地址[i]
        printf("%d,%#x  ", p[i], &p[i]);
        printf("%d,%#x  ", *(p + i), p + i);
        printf("\n");
    }

    getchar();
}


//指针引用二维数组(行指针,列指针)

void main(){
    int a[2][3] = {95,82,56,17,29,30};
    //遍历输出
    //外层循环控制行,内层循环控制列
    int i = 0;
    for (; i < 2; i++){
        int j = 0;
        for (; j < 3; j++){
            printf("%d,%#x  ", a[i][j], &a[i][j]);
        }
        printf("\n");
    }

    //
    //printf("%#x,%#x,%#x\n",a,&a,*a);
    //printf("%d,%d,%d\n", sizeof(*a), sizeof(*&a), sizeof(**a));
    //a是一个行指针,指向一个有三个元素的数组,12
    //&a是一个指向二维数组的指针,当前二维 数组6个元素,24
    //*a 是一个指向int类型数据的指针(a[0][0]),4
    //printf("%d\n", **a);

    //a是一个行指针,是数组第一行的指针,a+1第二行的指针,以此类推
    printf("%#x,%#x\n",a,a+1);
    //*a是数组的第一行第一个元素的指针,*a+1是数组第一行第二个元素的指针
    printf("%#x,%#x\n",*a,*a+1);
    //*(a+1)是数组的第二(1)行第一(0)个元素的指针
    //注意:不一定是正常逻辑
    printf("%#x,%#x\n",*(a+1),*(a+1)+1);


    //取数组的第1(二)行,第2(三)个元素
    printf("%d\n",a[1][2]);
    printf("%d\n",*(*(a+1)+2));

    //总结:
    //a[i][j] 等价于 *(*(a+i)+j)
    //&a[i][j] 等价于 (*(a+i)+j)

    getchar();
}

相关文章

  • 进击的NDK01-基本数据类型和指针

    NDK 基本数据类型 输入输出函数 指针 指针存储的是变量的内存地址内存地址,系统给数据分配的编号 变量名,对内存...

  • Const关键字理解(iOS)

    基本数据类型 const 在基本数据类型中的用法 指针类型 指针 的简单用法 const 与 指针 的结合使用 注...

  • iOS中const的简单介绍

    简单用法 基本数据类型 const 在基本数据类型中的用法 指针类型 指针 的简单用法 const 与 指针 的结...

  • js的数据类型及内存图

    js分为基本数据类型:null,undefined,string,number,Boolean和指针数据类型:数组...

  • 数据类型简介及输出

    (1) 数据类型简介 数据类型简介: Object - C 数据类型 分为 基本数据类型, 构造类型 和 指针类型...

  • iOS开发基础

    整理和查找了一下以前学习时候的资料 OC数据类型 1.数据类型 数据类型: 基本数据类型、指针数据类型 基本数据类...

  • C语言基础一

    一、基本数据类型 二、指针 1、基本 2、修改值 4、交换 5、多级指针 三、数组和数组指针 1、基础 数组指针,...

  • 第3章,数据

    基本数据类型 在C语言中,仅有4种基本数据类型----整形,浮点型,指针和聚合类型(数组和结构),所有其他的类型都...

  • NDK系列(一)C语言基本了解

    基本项目结构 基本数据类型 基本数据类型所占字节数 地址与指针:在C中 万物皆地址 指针取值 使用函数的时候 传值...

  • OC 常见的数据类型

    oc数据类型 数据类型:基本数据类型、指针数据类型 基本数据类型:数值型、字符型(char)、布尔型、空类型(vo...

网友评论

      本文标题:进击的NDK01-基本数据类型和指针

      本文链接:https://www.haomeiwen.com/subject/ryceiftx.html