C语言指针

 

变量的地址

       我们已经知道,内存变量简称变量,在C语言中,每定义一个变量,系统就会给变量分配一块内存,而内存是有地址的。如果把计算机的内存区域比喻成一个大宾馆,每块内存的地址就像宾馆房间的编号。

       C语言采用符号&获取变量的地址。请看下面的示例。

       示例(book50.c)

       

       运行结果

       

 

       注意:

       1)在printf函数中,输出内存地址的格式控制符是%p,地址采用十六进制的格式显示。

       2)book50程序运行了两次,每次输出的结果不一样,原因很简单,程序每次运行的时候,向系统申请内存,系统随机分配内存,就像你去宾馆开房,如果你不提前预约指定房号,每次得到的房间编号大概率不会相同。

指针

       指针是一种特别变量,全称是指针变量,简称指针,专用于存放其它普通变量在内存中的地址编号,指针在使用之前要先声明。

       指针声明的语法是:

       datatype *varname;

       datatype 是指针的基类型,它必须是一个有效的C数据类型(int、char、double或其它自定义的数据类型),varname 是指针的名称。用来声明指针的星号 * 与乘法中使用的星号是相同的。但是,在这个场景中,星号是用来表示这个变量是指针。以下是有效的指针声明:

       int     *ip;    // 一个整型的指针

       char    *cp;   // 一个字符型的指针

       double *dp;   // 一个 double 型的指针

对指针赋值

       不管是整型、浮点型、字符型,还是其他的数据类型的内存变量,它的地址都是一个十六进制数,可以理解为内存单元的编号。我们用整数型指针存放整数型变量的地址;用字符型指针存放字符型变量的地址;用双精度型指针存放双精度型变量的地址,用自定义数据类型指针存放自定义数据类型变量的地址。不同数据类型的变量的地址看上去没什么不同,但不能用指针随便指。

       把指针指向具体的内存变量的地址,就是对指针赋值。

       示例book50.c修改为book51.c

       

       运行结果

       

 

       不能直接对指针赋十进制或十六进制的值。

通过指针操作内存变量

       定义了指针变量,并指向了内存变量的地址,就可以通过指针来操作内存变量(在指针前加星号 *),效果与使用变量名相同。

       示例(book52.c)

       

 

       运行结果

       

 

再来讨论函数的参数传递

       在我们之前讲的函数的参数章节中,book48.c演示了函数的参数传递,现在把它修改一下。

       示例(book55.c)

       

       运行结果

       

       book55.c演示了函数参数和指针的使用,主程序把变量a的地址传递给函数func,func函数的参数p是一个指针,接受了变量a的地址。在函数func中,根据指针中的地址直接操作内存,从而修改了主程序中变量a的值。

       我们已经使用scanf函数很多次了,调用scanf函数的时候,需要在变量前面加符号&,其实就是把变量的地址传给scanf函数,scanf函数根据传进去的地址直接操作内存,改变内存中的值,完成了对变量的赋值。

空指针

       空指针就是说指针没有指向任何内存变量,指针的值是空,没有存放内存地址,所以不能操作内存。

       示例(book56.c)

       

       运行结果

       

       由于非法操作内存,引起了程序的崩溃。

数组的地址

       在C语言中,数组名是数组元素的首地址,也是数组的地址,看看以下代码:

       

       输出结果:

       

       从以上的示例可以看出,数组名、对数组取地址和数组元素的首地址是同一回事。

地址的运算

       地址可以用加(+)和减(-)来运算,加1表示下一个存储单元的地址,减1表示上一个存储单元的地址,一般情况下,指针的加减适用于数组,对单个变量的地址加减没有意义。

       示例(book58.c)

       

       运行结果

       

      大家请注意,输出的第一行的每个地址的增量是1,第二行的每个地址的增量是4,第三行的每个地址的增量是8,为什么会这样?因为数组cc是char型,一个存储单元是1个字节,数组ii是int型,一个存储单元是4个字节,数组ll是long型,一个存储单元是8个字节,指针加1指的是下一个存储单元,不是数学意义中的1。

      在应用开发中,地址的加减很重要,主要用于字符串操作,在以后的字符串章节中我再详细介绍。

指针占用内存情况

       指针也是一种内存变量,是内存变量就要占用内存空间,在C语言中,任何类型的指针占用8字节的内存。

       

       输出的结果都是8。

指针的其它知识

       本章节介绍的知识已经包括了指针99%的用法,还有一些的知识点,如指针的指针、函数指针等,这些概念难以理解,并且没什么实用价值。学习的方法应该是循序渐进,等你的功力增长之后,那些复杂的概念也很容易理解。如果在这里就把你搞晕了,就没办法继续学习下去。

小结

       要操作变量,可以用变量名,也可以用变量的地址。

       指针用一句话可以概括,就是用来存放变量的地址,是一种中间状态的变量。

       变量的地址是变量的地址,指针是指针,地址和指针之间的关系像水与水桶的关系,表达的时候要严谨一些,不要把地址说成指针,也不要把指针说成地址。

       指针就这么简单,你自己不要把自己晕了就行。

 

版权声明

C语言技术网原创文章,转载请说明文章的来源、作者和原文的链接。

来源:C语言技术网(www.freecplus.net

作者:码农有道

如果这篇文章对您有帮助,请点赞支持,或在您的博客中转发我的文章,谢谢!!!

如果文章有错别字,或者内容有误,或其他的建议或意见,请您留言指正,非常感谢!!!

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C语言技术网-码农有道

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值