C语言指针 小咪咪 2021-11-10 23:06 488阅读 0赞 # 变量的地址 # 我们已经知道,内存变量简称变量,在C语言中,每定义一个变量,系统就会给变量分配一块内存,而内存是有地址的。如果把计算机的内存区域比喻成一个大宾馆,每块内存的地址就像宾馆房间的编号。 C语言采用符号&获取变量的地址。请看下面的示例。 **示例(book50.c)** ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1Y3oxMjIxNDA3Mjk_size_16_color_FFFFFF_t_70][] **运行结果** ** **![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1Y3oxMjIxNDA3Mjk_size_16_color_FFFFFF_t_70 1][] 注意: 1)在printf函数中,输出内存地址的格式控制符是%p,地址采用十六进制的格式显示。 2)book50程序运行了两次,每次输出的结果不一样,原因很简单,程序每次运行的时候,向系统申请内存,系统随机分配内存,就像你去宾馆开房,如果你不提前预约指定房号,每次得到的房间编号大概率不会相同。 # 指针 # 指针是一种特别变量,全称是指针变量,简称指针,专用于存放其它普通变量在内存中的地址编号,指针在使用之前要先声明。 指针声明的语法是: datatype \*varname; datatype 是指针的基类型,它必须是一个有效的C数据类型(int、char、double或其它自定义的数据类型),varname 是指针的名称。用来声明指针的星号 \* 与乘法中使用的星号是相同的。但是,在这个场景中,星号是用来表示这个变量是指针。以下是有效的指针声明: int \*ip; // 一个整型的指针 char \*cp; // 一个字符型的指针 double \*dp; // 一个 double 型的指针 # 对指针赋值 # 不管是整型、浮点型、字符型,还是其他的数据类型的内存变量,它的地址都是一个十六进制数,可以理解为内存单元的编号。我们用整数型指针存放整数型变量的地址;用字符型指针存放字符型变量的地址;用双精度型指针存放双精度型变量的地址,用自定义数据类型指针存放自定义数据类型变量的地址。不同数据类型的变量的地址看上去没什么不同,但不能用指针随便指。 把指针指向具体的内存变量的地址,就是对指针赋值。 **示例book50.c修改为book51.c** ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1Y3oxMjIxNDA3Mjk_size_16_color_FFFFFF_t_70 2][] **运行结果** ![20190803200112859.png][] 不能直接对指针赋十进制或十六进制的值。 # 通过指针操作内存变量 # 定义了指针变量,并指向了内存变量的地址,就可以通过指针来操作内存变量(在指针前加星号 \*),效果与使用变量名相同。 **示例(book52.c)** ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1Y3oxMjIxNDA3Mjk_size_16_color_FFFFFF_t_70 3][] **运行结果** ![20190803200141891.png][] # 再来讨论函数的参数传递 # 在我们之前讲的函数的参数章节中,book48.c演示了函数的参数传递,现在把它修改一下。 **示例(book55.c)** ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1Y3oxMjIxNDA3Mjk_size_16_color_FFFFFF_t_70 4][] **运行结果** ![20190803200200919.png][] book55.c演示了函数参数和指针的使用,主程序把变量a的地址传递给函数func,func函数的参数p是一个指针,接受了变量a的地址。在函数func中,根据指针中的地址直接操作内存,从而修改了主程序中变量a的值。 我们已经使用scanf函数很多次了,调用scanf函数的时候,需要在变量前面加符号&,其实就是把变量的地址传给scanf函数,scanf函数根据传进去的地址直接操作内存,改变内存中的值,完成了对变量的赋值。 # 空指针 # 空指针就是说指针没有指向任何内存变量,指针的值是空,没有存放内存地址,所以不能操作内存。 ** 示例(book56.c)** ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1Y3oxMjIxNDA3Mjk_size_16_color_FFFFFF_t_70 5][] ** 运行结果** ![20190803200239706.png][] 由于非法操作内存,引起了程序的崩溃。 # 数组的地址 # 在C语言中,数组名是数组元素的首地址,也是数组的地址,看看以下代码: ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1Y3oxMjIxNDA3Mjk_size_16_color_FFFFFF_t_70 6][] **输出结果:** ![2019080320030544.png][] 从以上的示例可以看出,数组名、对数组取地址和数组元素的首地址是同一回事。 # 地址的运算 # 地址可以用加(+)和减(-)来运算,加1表示下一个存储单元的地址,减1表示上一个存储单元的地址,一般情况下,指针的加减适用于数组,对单个变量的地址加减没有意义。 **示例(book58.c)** ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1Y3oxMjIxNDA3Mjk_size_16_color_FFFFFF_t_70 7][] **运行结果** ![20190803200330728.png][] 大家请注意,输出的第一行的每个地址的增量是1,第二行的每个地址的增量是4,第三行的每个地址的增量是8,为什么会这样?因为数组cc是char型,一个存储单元是1个字节,数组ii是int型,一个存储单元是4个字节,数组ll是long型,一个存储单元是8个字节,指针加1指的是下一个存储单元,不是数学意义中的1。 在应用开发中,地址的加减很重要,主要用于字符串操作,在以后的字符串章节中我再详细介绍。 # 指针占用内存情况 # 指针也是一种内存变量,是内存变量就要占用内存空间,在C语言中,任何类型的指针占用8字节的内存。 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1Y3oxMjIxNDA3Mjk_size_16_color_FFFFFF_t_70 8][] 输出的结果都是8。 # 指针的其它知识 # 本章节介绍的知识已经包括了指针99%的用法,还有一些的知识点,如指针的指针、函数指针等,这些概念难以理解,并且没什么实用价值。学习的方法应该是循序渐进,等你的功力增长之后,那些复杂的概念也很容易理解。如果在这里就把你搞晕了,就没办法继续学习下去。 # 小结 # 要操作变量,可以用变量名,也可以用变量的地址。 指针用一句话可以概括,就是用来存放变量的地址,是一种中间状态的变量。 变量的地址是变量的地址,指针是指针,地址和指针之间的关系像水与水桶的关系,表达的时候要严谨一些,不要把地址说成指针,也不要把指针说成地址。 指针就这么简单,你自己不要把自己晕了就行。 # 版权声明 # C语言技术网原创文章,转载请说明文章的来源、作者和原文的链接。 来源:C语言技术网([www.freecplus.net][]) 作者:码农有道 如果这篇文章对您有帮助,请点赞支持,或在您的博客中转发我的文章,谢谢!!! 如果文章有错别字,或者内容有误,或其他的建议或意见,请您留言指正,非常感谢!!! [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1Y3oxMjIxNDA3Mjk_size_16_color_FFFFFF_t_70]: /images/20211109/d63420cad2034b2aaf6d9188cf895007.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1Y3oxMjIxNDA3Mjk_size_16_color_FFFFFF_t_70 1]: /images/20211109/0e06fd1b3cfc4840ba4038511cd1e7a7.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1Y3oxMjIxNDA3Mjk_size_16_color_FFFFFF_t_70 2]: /images/20211109/f91a56deb3ec48c38ce9822e502adf1c.png [20190803200112859.png]: /images/20211109/7071069c26e446eeb84cdc55d89821e0.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1Y3oxMjIxNDA3Mjk_size_16_color_FFFFFF_t_70 3]: /images/20211109/410dbc595d1b41728f6e4b15fdf845a8.png [20190803200141891.png]: /images/20211109/94889568bd4643f8ad1020b0b5c241f8.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1Y3oxMjIxNDA3Mjk_size_16_color_FFFFFF_t_70 4]: /images/20211109/4d773b2b1f2748549e94cbff7dc2c41d.png [20190803200200919.png]: /images/20211109/5bc35009953343afaf0adc35d1c71911.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1Y3oxMjIxNDA3Mjk_size_16_color_FFFFFF_t_70 5]: /images/20211109/8248f68e2a5d4adfb1f6c053a3bb7dba.png [20190803200239706.png]: /images/20211109/2dc4fe6ab3bb4553be8b9d5c640296d1.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1Y3oxMjIxNDA3Mjk_size_16_color_FFFFFF_t_70 6]: /images/20211109/81d42862151149a2bd68d504f310a779.png [2019080320030544.png]: /images/20211109/8e7a2a5b79d84afdb81e01791f3f1a4f.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1Y3oxMjIxNDA3Mjk_size_16_color_FFFFFF_t_70 7]: /images/20211109/1b453ead47634f30be9ce555550f2796.png [20190803200330728.png]: /images/20211109/f8e31508d9454390a678ca3207414bac.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1Y3oxMjIxNDA3Mjk_size_16_color_FFFFFF_t_70 8]: /images/20211109/7b4d27a2833744f192995fb44f26ce22.png [www.freecplus.net]: http://www.freecplus.net
相关 C语言指针 C语言指针 1、 指针概述: 1、指针是一种数据类型,占用内存空间。用来保存内存地址。 2、空指针: 标准定义了NULL指针,它作为一个特殊的指针变量, Bertha 。/ 2023年05月31日 07:56/ 0 赞/ 3 阅读
相关 【C语言】指针 50、指针变量用来记录地址数据 51、只有记录了有效地址的指针变量才可以使用 52、声明指针变量时需要在变量名称前写\ 53、指针变量名称前加\可以表示指针所捆绑的存储区 亦凉/ 2022年06月12日 04:49/ 0 赞/ 266 阅读
相关 c语言指针 //指针怎么用 // (区分两个概念,指针变量和指向内容,指针变量只保存一个地址值,在这个地址值对应的内存中具体存放的东西叫做指向内内容) 用变量 ╰半夏微凉°/ 2022年06月04日 08:58/ 0 赞/ 280 阅读
相关 C语言指针 C语言中,指针尤为重要。 1可以把指针看作是一个数据类型。 ![SouthEast][] 打印结果: ![SouthEast 1][] 2 在指针声 今天药忘吃喽~/ 2022年05月31日 03:39/ 0 赞/ 270 阅读
相关 C 语言指针 1、CPU 访问内存,是通过内存地址来读写内存数据的,CPU 与内存条硬件之间有个地址总线,CPU 通过地址总线将要访问/写入的内存地址告诉内存条。 2、对于 CPU 而言地 拼搏现实的明天。/ 2022年05月29日 01:54/ 0 赞/ 305 阅读
相关 C语言指针 1、指针的基本知识 (1)定义 int \p; (2)赋值 1) int a;int p=&a 2) int a ;int p; 喜欢ヅ旅行/ 2022年03月26日 05:22/ 0 赞/ 316 阅读
相关 C语言:指针 今天研究了一下午终于把指针研究明白了 include<stdio.h> include<stdlib.h> int main() { 快来打我*/ 2022年03月25日 21:14/ 0 赞/ 329 阅读
相关 C语言-指针 1.指针和指针变量 > 内存区的每一个字节都有编号,这就是地址 > 如果在程序中定义了一个变量,在对程序进行编译和运行时,系统就会给这个变量分配内存单元,并确 àì夳堔傛蜴生んèń/ 2022年01月26日 11:17/ 0 赞/ 377 阅读
相关 C语言指针 变量的地址 我们已经知道,内存变量简称变量,在C语言中,每定义一个变量,系统就会给变量分配一块内存,而内存是有地址的。如果把计算机的内存区域比喻成一个 小咪咪/ 2021年11月10日 23:06/ 0 赞/ 489 阅读
还没有评论,来说两句吧...