伍佰目录 短网址
  当前位置:海洋目录网 » 站长资讯 » 站长资讯 » 文章详细 订阅RssFeed

大学生博客大赛

来源:本站原创 浏览:131次 时间:2022-01-19
关于C语言中的指针
    --对于很多C语言的学习者来说,指针无疑是一个很让人迷惑的东西,往往让人一头雾水,很多类C的编程语言(Java等)甚至移除了指针这个概念。但其实,指针可以说是C语言的灵魂,运用得当,可以发挥巨大的作用,现在就让我们一起来学习一下指针。

 首先,让我们来弄清楚,什么是指针?

我们都知道,C语言中,变量是存放在内存中的,而内存可以简单理解为一个有序字节组成的数组,每一个字节都有对应的位置,那么变量就应该有对应的储存地址。而指针,就是储存着变量地址的变量。

这么说可能有些拗口,大家可以参考下图,内存有很多字节都是顺序排布,每个字节的都对应一个地址。

假设一个int 类型的变量a储存在内存的0x00000001到0x00000004(int类型占4个字节),那么a的地址的值就是这段内存的首地址,即0x00000001,我们用一个4个字节的变量来储����,���存这个值,这个就是指针,0x00000001就是这个指针的值。

但是我们光知道这段内存的首地址并不能让我们完全确定这个变量,至少我们还需要找到这段内存的长度,这一点可以通过指针的类型来决定。比如double类型的指针就表明指向的这段内存占有8个字节,我们知道了这段内存的首地址,还知道了它的长度,就可以找到这段内存了。

所以指针其实包含两个内容,指针的值和类型,指针的值确定这段内存的首地址,类型可以帮我们确定这段内存的长度。

接下来,我们来聊聊为什么要用指针。

1,指针可以让不同区域共享数据。

比如说,函数B想要使用变量a的数据,只需要得到a的指针,就可以轻易访问a的内存,进而获取a的数据。有人说,可以直接复制变量a来获取a的数据,但是如果变量a的类型是一个比较复杂的结构体,那么复制a的代价就会很大,需要占用很多的内存。而所有的指针都只占4个字节,所以可以减少内存和性能的消耗。

2,C语言参数传递的时候,是按值传递,我们把a当作参数传入函数B,在函数中修改a,并不会让a本身发生改变,但如果我们将a的指针传入B,就可以在函数B中修改达到修改a本身的目的。

3,C语言中一些复杂的数据结构往往需要使用指针来构建,如链表、二叉树等;

4,我们在堆上申请内存的时候,必须使用指针。

除此之外,指针还有很多的妙用,可以让我们的编程变得更加轻松,并且提高程序的运行效率。

 

知道了为什么要用指针之后,我们来聊一聊指针的基本运算。

1,&和*

这里&是取地址运算符,*是间接运算符。

      &a 的运算结果是一个指针,指针的类型是a 的类型加个*,指针所指向的类型是a 的类型,指针所指向的地址嘛,那就是a 的地址。

      *p 的运算结果就五花八门了。总之*p 的结果是p 所指向的东西,这个东西有这些特点:它的类型是p 指向的类型,它所占用的地址是p所指向的地址


值得注意的是,指针本身也是一个变量,变量都是储存在内存中的,所以指针本身也存在指针,指针的指针我们成为二级指针。

 

2,指针的算数运算

指针支持加减两种算数运算,而且一般只能加减整数。我们先来看一个例子。

char a[20] = “hellow world”;

int* ptr = (int*)a;

ptr++;

 

大家猜测一下现在ptr指向哪里,是不是指向’e’

其实正确答案是指向’o’。指针ptr 的类型是int*,它指向的类型是int,它被初始化为指向整型变量a。接下来的第3句中,指针ptr被加了1,编译器是这样处理的:它把指针ptr 的值加上了sizeof(int),在32 位程序中,是被加上了4,因为在32 位程序中,int 占4 个字节。由于地址是用字节做单位的,故ptr 所指向的地址由原来的变量a 的地址向高地址方向增加了4 个字节。由于char 类型的长度是一个字节,所以,原来ptr 是指向数组a 的第0 号单元开始的四个字节,此时指向了数组a 中从第4 号单元开始的四个字节。

其实指针还可以加减指针,不过本文不做讨论。

 

3,指针的关系运算

<   <=   >   >=  不过前提是它们都指向同一个数组中的元素。根据你所使用的操作符,比较表达式将告诉你哪个指针指向数组中更前或更后的元素。标准并未定义如果两个任意的指针进行比较会产生什么结果。

 

刚刚我们将指针和数组进行了转化,现在让我们来聊一聊指针和数组的关系。

其实,数组名就可以看作一个指针,很多数组操作都可以用指针来代替,一般用指针编写的程序运行速度会快一些,但是指针会让程序更难理解。

对于数组char array[20],数组名array有两层含义:

1,array代表整个数组,它的类型是char[20];

2,array也可以看作是一个指针常量,类型是char*,指向的内存的值就是char[0]所在的内存的地址,不过值得注意的是,该指针自己占有单独的内存区,注意它和数组第0 号单元占据的内存区是不同的。该指针的值是不能修改的。

好滴~通过上述小编的表述,相信大家对C语言中的指针有了初步了解,感谢各位的耐心观看~第一次写文,漏洞很多,望海涵~


  推荐站点

  • At-lib分类目录At-lib分类目录

    At-lib网站分类目录汇集全国所有高质量网站,是中国权威的中文网站分类目录,给站长提供免费网址目录提交收录和推荐最新最全的优秀网站大全是名站导航之家

    www.at-lib.cn
  • 中国链接目录中国链接目录

    中国链接目录简称链接目录,是收录优秀网站和淘宝网店的网站分类目录,为您提供优质的网址导航服务,也是网店进行收录推广,站长免费推广网站、加快百度收录、增加友情链接和网站外链的平台。

    www.cnlink.org
  • 35目录网35目录网

    35目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向35目录推荐、提交优秀网站。

    www.35mulu.com
  • 就要爱网站目录就要爱网站目录

    就要爱网站目录,按主题和类别列出网站。所有提交的网站都经过人工审查,确保质量和无垃圾邮件的结果。

    www.912219.com
  • 伍佰目录伍佰目录

    伍佰网站目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向伍佰目录推荐、提交优秀网站。

    www.wbwb.net