zoukankan      html  css  js  c++  java
  • 如何理解指针

     

    指针可以说是C语言的一大难点,很多人都比较讨厌指针。我个人学习C语言也有一段时间了,今天就指针做一点总结。

     

    简单变量

    在C语言中定义一个简单变量,例如int a = 4,这个时候,就会在内存空间中开辟一个4个字节大小的空间,并且给这个变量赋值为4。这里的int可以换成float、double、long都可以,只不过类型不同,会占用不同大小的内存空间。

     

    指针(pointer)

    指针也是变量,大家一定要注意这一点,很多教科书上关于指针的说法都是不准确的。那么既然指针也是变量,那么指针与一般的变量有什么区别呢?

    其实很简单,指针变量里存放的是地址。指针变量用来存放地址这句话其实可以换一种说法,换成指针变量指向某一个地址,这是一种比较形象的说法,这个更符合指针这一词的含义。

    既然指针也是变量,那么它同样也占据一定大小的内存空间。指针占据的大小与平台有关。对于32位的平台而言,指针变量一般占用4个字节。对于64位的平台而言,指针变量一般占用8个字节。

    指针的定义与初始化

    定义一个指针:int *p;

    int表明表明这个指针变量所指向的地址里存放的是int型数据,也可以是char 、double、struct等。

    *用来区别于简单变量,表明这是一个指针变量。

    p表示这个指针变量名为p。

     

    指针初始化,一般习惯于将指针初始化为空: p = NULL;

     

    指针的赋值

    指针的赋值分为两种情况:

    直接复制:

    int a =  4;

    int *p = &a;

    (这里补充一下字符串常量可以直接给char型指针赋值: char *t = "dasdadasd")

    这样指针P就指向了变量a的地址,这里面&为取地址符,顾名思义就是获得变量地址的。

    指针之间的相符赋值:

    int *t =  p;

    通过这种赋值指针变量p就指向了变量a的地址,与指针p的指向是相同的。

     

    二级指针

    也就是我们常说的指针的指针。二级指针也不难理解。同样它也是一个指针,它与普通指针的区别在于,它所指向的地址中所存放的是指针而已,不再是其他类型的变量了。

    定义一个二级指针:char **p ;

     

     

    通过指针来访问它指向地址里存放的数据

    这个就不多说了,很简单通过*号就可以实现了,这里就不多说了。

     

    指针与数组的关系

    我们可以设想以下:如何我们让一个指针指向一个数组的首地址,那么这样是不是就能够操作这整个数组了呢

    这样假设是可以理解的,因为我们都知道数组在内存中是连续的,只要知道了首地址的位置就可以确定每一个元素的位置了。

    实际上,指针与数组名在写法上是完全等价的,但是这两者在概念上还是有所区别。

    例如:定义了一个数组 int a[100]; 这个时候数组名a可以给一个int型指针赋值,但是反过来就不行,因为这个数组是经过完整定义过的,它在内存空间里开辟100的连续的存储单元,数组的首地址a已经确定了,是不能再修改的。

    但是还有一种情况,通过数组名进行传参,例如int a [ ]这种形式,这种写法严格来说没有定义数组,它只是进行一个声明,数组名a是可以接受指针赋值的。

    由以上概念所引出来的概念:

    数组指针:就是指数组名。

    指针数组:是一个数组,只不过每一个数组元素中存放的是一个指针,数组名是一个二级指针。

     

    指针的用处

    可能会有人会问指针到底有什么用?

    指针可以直接操作内存,使得内存管理更加灵活。

    指针可以解决传递参数的问题。

     

    注:以上所提及到的内存空间均是指逻辑上的地址空间,计算机用户一般不直接接触真实的物理内存。

       在对指针进行操作的时候,我们需要考虑清楚是改变指针的指向还是改变指针指向的内容

  • 相关阅读:
    门禁复制
    ImportError: cannot import name 'COMMAND' from 'MySQLdb.constants'
    Python3:模块:ModuleNotFoundError No module named 'MySQLdb'
    zookeeper问题:关于Unable to read additional data from server sessionid 0x0问题的解决
    Linux内存分析free与cache清理
    X-pack结合LDAP进行权限认证
    Django2.2框架:ORM数据库操作
    Django框架:模板继承和静态文件配置
    Djiango框架:模板语法
    Django2.2.x框架:基础篇(二)
  • 原文地址:https://www.cnblogs.com/mlgjb/p/8697426.html
Copyright © 2011-2022 走看看