zoukankan      html  css  js  c++  java
  • C/C++-指针

    指针被称为"C语言的灵魂"。实际上是一种专门用于保存内存地址的变量。

    1.定义一个指针

    在C语言中,我们使用形如int *p;的语句来声明一个指针,其中int可以替换成char,double等基础数据类型,跟在p前面的*表明p是一个指针类型(int *)的变量。但在程序编写过程中,这样仅声明指针却不进行初始化是非常危险的,这类指针通常被称为"野指针"。因此推荐在声明的同时便对指针进行初始化:

    int i = 10;
    int *p = &i;  // 用p保存i的内存地址
    

    可能新学的同学看不大明白这两行代码,没关系,接下来便是对这两行代码的解释。

    2.指针的基础使用

    在学习指针基础使用之前我们最好能够了解一些关于计算机中内存预备知识。
    在计算机中,内存在逻辑上会被划分为很多部分以方便CPU的访问。可以想象成所有数据住在一个名为"内存"的地方,而各个数据都待在各自"家"中,为了方便大家找到这些数据,每个数据存在的地方都有一个对应的地址(相当于门牌号),cpu能够通过指定地址找到其唯一对应的内存单元。下面我们用一张图模拟一下在上述代码运行后i和p在内存中的分布情况:
    内存情况
    上图中最左侧是变量p和i的内存地址,而矩形内便是变量的内存中实际存放的数据。显然,指针p的内存中存放的是i的内存地址。
    同时,因为所有指针存放的都是内存地址,因此同一环境下所有指针的字长都是相同的(例如32位时字长为8,64位时字长为16);

    (1)取地址符&
    在上文的指针初始化代码中,我们可以看到int *p = &i这部分代码,这句表达式的作用即是通过取地址符&将整形变量i的内存地址赋值给整形指针p。即上图中,在p对应内存中写入i的内存地址2000H。

    (2)指向运算符*
    在声明结束后,我们可以通过指向运算符*,以形如*p的方式,来读取指针所指向的内存地址中存放的内容(通常简称为指向的内容)。

    我们通过两行代码看看&和*的用法:

    printf("p = %d
    ", p);  // 输出指针p的存放的内容(此处为i的内存地址)
    printf("*p = %d
    ", *p) // 输出指针p指向的内容 (即i在内存中的内容)
    

    代码运行结果如下图:
    代码运行结果

    值得注意的是,我们在平时使用指针时应该养成良好的编程习惯,即在声明的同时便完成指针的初始化;如果还不确定该指针应指向的内存,我们可以先将其指向null初始化成空指针。

    3.数组与指针

    在C语言中,数组便是最常用的指针,是一段连续的内存空间;实际上a[5]*(a + 5)是等价的。
    实例代码如下:
    数组

    4.在函数中充当参数

    C语言中,运行函数时,函数会额外开辟一块内存空间,传入参数时仅是将参数内存地址中的值,在函数中改变传入的参数并不会改变他实际的值。
    如下图所示:
    形参
    但是我们可以通过传入指针值,来通过指针保存的地址直接对变量内存中的值进行操作:
    指针形参

    除了使用指针外,实际上我们还可以通过引用来实现在函数中改变变量的值,具体方法这可以看这篇博客

  • 相关阅读:
    spring的bean的属性注入
    spring中bean的常用属性
    spring Code(spring 核心)
    mybatis的缓存
    mybatis 调用存储过程
    mybatis的动态sql
    mybatis的关系映射
    mybatis添加信息自动生成主键
    mybatis传递参数的方法
    如何编写跨平台的Java代码
  • 原文地址:https://www.cnblogs.com/Bylight/p/10451598.html
Copyright © 2011-2022 走看看