专栏首页Android小知识NDK启航篇——C语言基础(指针)

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("%#x\n",j);
//取出j地址里存的值
    printf("%d\n",*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:%#x\n",j,k);
//加一个*是i的地址,加两个*是i的值
  ** k = 20;
  printf("%d\n",i);
  getchar();
}

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

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

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

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

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

    这里是彩蛋哦,肯定有人会问这就结束了,指针函数呢? ?,指针函数和函数指针并没有什么关系,非常简单,就是函数的返回值是指针而已,前面已经讲过指针是什么了所以就不...

    longzeqiu
  • NDK启航篇——C语言基础

    longzeqiu
  • NDK启航篇——C语言基础(字符串)

    longzeqiu
  • NDK启航篇——C语言基础(结构体)

    longzeqiu
  • NDK启航篇——C语言基础(联合体)

    longzeqiu
  • NDK启航篇——C语言基础(内存分配)

    longzeqiu
  • NDK启航篇——C语言基础(结构体补充)

    longzeqiu
  • NDK启航篇——C语言终章(文件IO操作)

    longzeqiu
  • C语言函数指针基础

    本文写的非常详细,因为我想为初学者建立一个意识模型,来帮助他们理解函数指针的语法和基础。如果你不讨厌事无巨细,请尽情阅读吧。 函数指针虽然在语法上让人有些迷惑,...

    猿人谷
  • c语言基础学习07_指针

    =============================================================================

    黑泽君
  • 【编程基础】C语言之指针二

    指针和数组 C语言的数组表示一段连续的内存空间,用来存储多个特定类型的对象。与之相反,指针用来存储单个内存地址。数组和指针不是同一种结构因此不可以互相转换。而数...

    程序员互动联盟
  • C语言中指针的基础知识

    第一次:找出最大的值,然后记录下来最大值的位置; 第二次查找的时候把最大值的位置的数据给清空,继续寻找最大的值,那么这一次的最大的值就是第二大的。

    TrueDei
  • 【编程基础】C语言指针函数和函数指针

    往往,我们一提到指针函数和函数指针的时候,就有很多人弄不懂。下面详细为大家介绍C语言中指针函数和函数指针。 一、指针函数 当一个函数声明其返回值为一个指针时,实...

    程序员互动联盟
  • 【C语言简单说】二十:指针基础

    =。=。据说指针很难 其实稍微理解概念不难=。= 先看百科的定义:在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(p...

    公众号 碧油鸡
  • go语言基础4-指针

    吐吐吐吐吐葡萄皮
  • 【视频】C语言基础教程十、指针(一)

    来源:互联网 ? ----

    编程范 源代码公司
  • 【编程基础】C语言指针、引用和取值

    什么是指针?什么是内存地址?什么叫做指针的取值?指针是一个存储计算机内存地址的变量。“引用”表示计算机内存地址。从指针指向的内存读取数据称作指针的取值。指针可以...

    程序员互动联盟
  • 「学习笔记」C语言(二):指针篇

    这是我大一暑假时系统学习谭浩强第三版《C程序设计》时写下的笔记。也正是因为那一次耗时整整一个星期系统性地学习这本书,才奠定了我现在的编程基础和逻辑...

    悠风
  • Android JNI(一)——NDK与JNI基础

    Android 平台从一开就已经支持了C/C++了。我们知道Android的SDK主要是基于Java的,所以导致了在用Android SDK进行开发的工程师们都...

    隔壁老李头

扫码关注云+社区

领取腾讯云代金券