android ndk 02 C语言 二级指针 指针运算 指针与数组

来源:互联网 发布:制作游戏的软件 编辑:程序博客网 时间:2024/05/22 23:34

c函数速查: https://pan.baidu.com/s/1sllYdul

通过几个例子 复习 二级指针 指针的运算 指针与数组 函数指针 练习

指针为什么要有类型

指针和地址的区别, 指针有类型 地址没有类型.

#include <stdio.h>#include <stdlib.h>#include <Windows.h>#include <math.h>#include <time.h>//这是引用的头文件

举例: 1

// 1.指针为什么要有类型?

//指针有类型,地址没有类型

//地址只是开始的位置,类型读取到什么位置结束

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();}

2. NULL空指针 指针初始化

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

3, 多级指针 使用

//3.多级指针(二级指针)//指针保存的是变量的地址,保存的这个变量还可以是一个指针变量//动态内存分配给二维数组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();}

上面的例子 通过操作二级指针改变了 a 的值

个人理解 : 二级指针 可以理解成二维数组 三级指针可以理解成三位数组

一级指针是一条线 , 二级指针是一个面, 三级指针 是一个立方体 .

image

— 分割线 —

第4个例子 指针的运算

发现markdown > 操作不错

//4 指针的运算void main(){    int ids[] = { 78, 90, 23, 65, 19 };    printf("%#x\n", ids);    printf("%#x\n", &ids);    printf("%#x\n", ids[0]);    //指针变量    int *p = ids;    printf("%d\n", *p);//默认打印第0个    //指针的加法    p++;    printf("p的值 %d\n", *p);    printf("16进制 %#x\n", *p);    getchar();}

效果图

image

第五个例子 通过指针给数组赋值

//5 通过指针给数组赋值void main(){    int uids[5];    //int i = 0;    //高级写法 现在的写法  这里没有操作指针 实际上内部操作了    /*for (i; 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++;    }    int j = 0;    for (; j < 5; j++)    {        printf("数组 uids[%d] = %d \n", j, uids[j]);    }    getchar();}

iamge

第六个例子 函数指针

函数指针1

int msg(char *msg, char *title){    messagebox(0, msg, title, 0);     return 0;}void main(){    //函数返回值类型,函数指针的名称,函数的参数列表    //函数指针 这是把一个函数赋给指针    int(*fun_p)(char *msg, char *title) = msg;    fun_p("内容", "title");    getchar();}

image

函数指针2 例子

int add(int a, int b){    return a + b;}int minus(int a, int b){    return a - b;}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 作为参数穿进去了    msg(add, 3 , 5);    getchar();}

运行结果

image

最后一个例子

//案例:用随机数生成一个数组,写一个函数查找最小的值,并返回最小数的地址,在主函数中打印出来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    //看c语言速查表    srand((unsigned)time(NULL));    for (i; i < 10; i++)    {        //100范围内        ids[i] = rand() % 100;        printf("%d\n", ids[i]);    }    //调用    int* p = getMinPointer(ids, sizeof(ids) / sizeof(int));    printf("指针地址: %#x, 最小值: %d", p, *p);    getchar();}

运行结果:

image

原创粉丝点击