NDK启航篇——C语言基础(指针)

昨天已经介绍了下什么是指针,今天继续讲指针

为什么指针要有类型

  • 因为类型不同的指针所取的内存长度不同,取值会出现问题,比如int 类型的指针,接收double类型的变量地址。
//尖括号代表系统类库,std表示标准,io表示输入输出 引入标准输入输出  #include<stdio.h>  //lib表示类库 引入标准类库  #include<stdlib.h>  main(){    int a = 10;  //取出a的地址,赋值给指针p    int *p = &a;  //#x表示十六进制,取出a的地址    println("%#x",p);  //取出a地址里存的值    println("%d",*p);    double j = 34.1;    p  = &j;  //#x表示十六进制,取出j的地址    println("%#x",p);  //取出j地址里存的值    println("%lf",*p);    system("pause");  }

如上代码运行你会发现取出来的值为0.00000,原因就是指针的类型不匹配(通过4字节读取8字节的内容)

空指针(NULL)

  • 空指针的默认值为0
  • 操作系统不准许访问内存地址0X000000
 void main(){      int i = 10;  //定义一个空指针j      int *j = NULL;  //#x表示十六进制,取出j的地址      printf("%#xn",j);  //取出j地址里存的值      printf("%dn",*j);      system("pause");  }

多级指针(二级)

  • 指针保存的是变量的地址,保存的这个变量还可以是一个指针变量
void main(){  //定义一变量i    int i = 10;  //把i的地址赋值给j    int *j = &i;  //把j的地址赋值给k    int **k = &j;  //k存的j的地址,j上存的i的地址    printf("j:%#x,k:%#xn",j,k);  //加一个*是i的地址,加两个*是i的值    ** k = 20;    printf("%dn",i);    getchar();  }

加一个*是i的地址,加两个*是i的值(最多三级指针)

  • 使用场景
    • 动态内存分配
    • 二维数组

指针运算(对数组的操作)

  • 注意C中数组[]必须写在变量名的后面!
  • 数组变量名:i就是数组的首地址
  • 数组在内存中是连续存储的
  • 数组变量名++向前移动sizeof(数据类型)个字节
  • 数组变量名--向后移动sizeof(数据类型)个字节
void main(){    int i [] = {11,12,13,14,15};  //数组变量名:i就是数组的首地址    printf("%#xn",i);    printf("%#xn",&i[0]);  //数组的变量名就是地址    int *j = i;    printf("%dn",*j);  //指针加法    j++;//j++向前移动sizeof(数据类型)个字节    printf("%dn",*j);    getchar();  }
  • 使用场景
    • 一般在数组遍历时才有意义
    • 因为数组在内存中是线性排列的
  • 通过指针给数组赋值代码如下:
void main(){  //定义有五个元素的数组i    int i [5] ;  //把数组i的地址赋值给指针j    int *j = i;  //数组的值    int k = 0;  //通过指针给数组赋值    for(;j<i + 5;j++){      *j = k;      k++;    }  }

今天就先到这里啦,明天继续写函数指针,欲速则不达,慢慢来不着急。