Android NDK基础3:C_指针与数组_函数指针

指针与数组

//1.通过指针给数组赋值
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();
}

//2.指针与数组的几种写法
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();
}

函数指针

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>

//3.函数指针
int msg(char* msg, char* title) {
    MessageBox(0, msg, title, 0);
    return 0;
}

void main() {
    //msg();
    //msg和&msg都是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;
}

//compute函数需要传递一个函数指针参数
//类似于我们Java中的回调函数
void compute(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;
    compute(add, 10, 20);
    //减法
    //compute(minus, 50, 10);
    getchar();
}

综合案例

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <math.h>
#include <time.h>

//案例:用随机数生成一个数组,写一个函数查找最小的值,并返回最小数的地址,在主函数中打印出来
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();
}

版权声明:
作者:Joe.Ye
链接:https://www.appblog.cn/index.php/2023/02/25/android-ndk-basic-c-pointer-and-arrays-function-pointer/
来源:APP全栈技术分享
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
打赏
海报
Android NDK基础3:C_指针与数组_函数指针
指针与数组 //1.通过指针给数组赋值 void main() { int uids[5]; //高级写法 //int i = 0; //for (; i < 5; i++) { // uids[i] = i……
<<上一篇
下一篇>>
文章目录
关闭
目 录