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

吾心所向,一往无前

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();
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容