C语言指针专题——如何理解指针
2017-07-11 08:33
337 查看
小鱼的技术博客,主谈C语言编程,顺便谈谈人生,谈谈理想,关注热链:我的CSDN技术博客
本文为原创,欢迎转发!
最近在研读C primer plus 5版中文版,老外写的,还是很经典的,推荐给读者们,有需要的朋友可以在这里购买:C primer plus 5版中文版
指针,传说中是C语言中的一个难点,且是难点中的难点。本文在教材的基础上,再详细地谈谈“指针”这个东东,力争让大家能理解它。
最新的文章在“C语言编程技术分享”,也就是我的公众号里更新,欢迎关注!
一、指针的概念
关于指针的定义,很多教材一般给出“它是一个地址”,“存储的是变量的地址”,“指向了一个值”等等描述。这样描述其实也没错,但是就是不那么好理解。我觉得要理解指针,无需给出什么定义,只需讲透如下5个点,我认为基本就可以理解一个指针了。这5个点我总结如下:
1. 指针是一个普通的变量;
2. 既然指针是变量,那么肯定有自己的类型;
3. 既然指针是变量,那么肯定有自己的值;
4. 只不过指针的值跟一般变量的值不太一样,指针的值是一个“地址”。
5. 指针指向的数据
为了讲透这5个点,下面列举一段代码,如下。
二、代码来说明
请欣赏以下代码
三、下面结合代码我来谈谈那5个点:
1. 指针是一个普通的变量
本例中,有一个字符变量“c”,它的值是string[0],也就是“S”,这个大家都很好理解。
还有一个指针“pointer”,注意,它也是一个变量,和字符“c”一样,就是一个普通的变量而已,它也有一个值,它的值是“&string[0]”,从运行结果来看,就是“0022FED9”,这是一个16进制的数。
2. 指针自己的类型
本例中,字符变量“c”的类型是“char”,数组string的类型也是“char”,那么指针“pointer”的类型也是“char”。不过与c和string的类型char相比,pointer类型的char却有一点小区别。
变量c的类型char说明了c的值“S”是一个字符数据,数组string的类型char说明了其每一个数组元素也是字符数据,但是指针pointer的类型char是不是也说明“0022FED9”是一个字符数据呢?傻子都知道当然不是啦!那么pointer的char类型到底是在说谁呢?这就是指针的一个诡异的地方。等讲完第5点指针指向的数据你就知道了。
3. 指针自己的值
上面已经说了,指针既然也是一个变量,那么肯定有自己的值,在本例中,指针自己的值就是“0022FED9”,是一个16进制的数,这个值哪来的?是“&string[0]”赋予给指针的。
“0022FED9”这个东东也是很多教材中提到的“地址”。很多人会想,你告诉我“0022FED9”是一个值我还好理解,你告诉我它还是一个什么地址,这就让人晕菜了,下面第4点就来说说这个“0022FED9”。
4. 指针的值
不知大家发现没有,在C程序中,如果定义了int,char等变量,那么在代码中很多地方都会用到这些变量的值。比如在本例中,定义了数组string,则接下来的代码就用到了数组的元素,也就是printf函数输出来。如果定义了一个指针变量,可能大家很少看到在代码中会用到指针的值,比如在本例中,大家就没有看到用到“0022FED9”。
确实,相比一般类型变量的值被频繁使用而言,指针的值很少会被直接用到。注意,这里说的很少被直接用到,是指写代码的人,也就是程序猿会很少用到,但有一个角色用指针的值用的非常多,就是操作系统。
比如在本例中,输出数组的每一个元素时,我表面上是用的*(pointer + index)来输出的,其实在背后,操作系统在执行这个语句时,都是利用指针的值“0022FED9”来找到数组的每一个元素的,所以程序最终能正确输出数组的每一个字符。
上面也说了,“0022FED9”是被系统用的最多,为啥被系统用的最多呢?因为“0022FED9”是一个地址,是string数组的第一个元素“S”的地址。说的再通俗一点,字符“S”放在一个大小为1BYTE的内存块里,这个内存块的地址就是“0022FED9”。
5. 指针指向的数据
在第4点说到,字符“S”放在一个大小为1BYTE的内存块里,这个内存块的地址就是“0022FED9”,那么,我们就说,指针“pointer”的值是“
4000
0022FED9”,在地址为“0022FED9”的地方放了一个字符“S”,这个“S”就是指针“pointer”指向的数据,且通过“*pointer”这种写法来获取“S”,从某种意义上来说:
pointer 等于 0022FED9;
*pointer等于“S”,加上*号,就是直捣黄龙,拿到“S”。
此时我们可以说说第2点中提到的指针的类型是来修饰谁的问题了。在本例中,pointer的类型char显然不是来修饰“0022FED9”的,它是来告诉操作系统,我pointer认为“0022FED9”这个地方存放的是字符,是字符,是字符,且占1个BYTE的大小。
如果pointer的类型改为int,我pointer就认为“0022FED9”这个地方存放的是整数,是整数,是整数字符,且占4个BYTE的大小。
本文为原创,欢迎转发!
最近在研读C primer plus 5版中文版,老外写的,还是很经典的,推荐给读者们,有需要的朋友可以在这里购买:C primer plus 5版中文版
指针,传说中是C语言中的一个难点,且是难点中的难点。本文在教材的基础上,再详细地谈谈“指针”这个东东,力争让大家能理解它。
最新的文章在“C语言编程技术分享”,也就是我的公众号里更新,欢迎关注!
一、指针的概念
关于指针的定义,很多教材一般给出“它是一个地址”,“存储的是变量的地址”,“指向了一个值”等等描述。这样描述其实也没错,但是就是不那么好理解。我觉得要理解指针,无需给出什么定义,只需讲透如下5个点,我认为基本就可以理解一个指针了。这5个点我总结如下:
1. 指针是一个普通的变量;
2. 既然指针是变量,那么肯定有自己的类型;
3. 既然指针是变量,那么肯定有自己的值;
4. 只不过指针的值跟一般变量的值不太一样,指针的值是一个“地址”。
5. 指针指向的数据
为了讲透这5个点,下面列举一段代码,如下。
二、代码来说明
请欣赏以下代码
#include <stdio.h> #include <string.h> int main(void) { char string[15] = "ShiXP love C!"; char c = string[0]; char *pointer; pointer = &string[0]; printf("指针pointer的值是%p \n", pointer); for(int index = 0;index < strlen(string); index++) { printf("第%d个字符是:%c \n", index + 1, *(pointer + index)); } return 0; }运行结果是:
三、下面结合代码我来谈谈那5个点:
1. 指针是一个普通的变量
本例中,有一个字符变量“c”,它的值是string[0],也就是“S”,这个大家都很好理解。
还有一个指针“pointer”,注意,它也是一个变量,和字符“c”一样,就是一个普通的变量而已,它也有一个值,它的值是“&string[0]”,从运行结果来看,就是“0022FED9”,这是一个16进制的数。
2. 指针自己的类型
本例中,字符变量“c”的类型是“char”,数组string的类型也是“char”,那么指针“pointer”的类型也是“char”。不过与c和string的类型char相比,pointer类型的char却有一点小区别。
变量c的类型char说明了c的值“S”是一个字符数据,数组string的类型char说明了其每一个数组元素也是字符数据,但是指针pointer的类型char是不是也说明“0022FED9”是一个字符数据呢?傻子都知道当然不是啦!那么pointer的char类型到底是在说谁呢?这就是指针的一个诡异的地方。等讲完第5点指针指向的数据你就知道了。
3. 指针自己的值
上面已经说了,指针既然也是一个变量,那么肯定有自己的值,在本例中,指针自己的值就是“0022FED9”,是一个16进制的数,这个值哪来的?是“&string[0]”赋予给指针的。
“0022FED9”这个东东也是很多教材中提到的“地址”。很多人会想,你告诉我“0022FED9”是一个值我还好理解,你告诉我它还是一个什么地址,这就让人晕菜了,下面第4点就来说说这个“0022FED9”。
4. 指针的值
不知大家发现没有,在C程序中,如果定义了int,char等变量,那么在代码中很多地方都会用到这些变量的值。比如在本例中,定义了数组string,则接下来的代码就用到了数组的元素,也就是printf函数输出来。如果定义了一个指针变量,可能大家很少看到在代码中会用到指针的值,比如在本例中,大家就没有看到用到“0022FED9”。
确实,相比一般类型变量的值被频繁使用而言,指针的值很少会被直接用到。注意,这里说的很少被直接用到,是指写代码的人,也就是程序猿会很少用到,但有一个角色用指针的值用的非常多,就是操作系统。
比如在本例中,输出数组的每一个元素时,我表面上是用的*(pointer + index)来输出的,其实在背后,操作系统在执行这个语句时,都是利用指针的值“0022FED9”来找到数组的每一个元素的,所以程序最终能正确输出数组的每一个字符。
上面也说了,“0022FED9”是被系统用的最多,为啥被系统用的最多呢?因为“0022FED9”是一个地址,是string数组的第一个元素“S”的地址。说的再通俗一点,字符“S”放在一个大小为1BYTE的内存块里,这个内存块的地址就是“0022FED9”。
5. 指针指向的数据
在第4点说到,字符“S”放在一个大小为1BYTE的内存块里,这个内存块的地址就是“0022FED9”,那么,我们就说,指针“pointer”的值是“
4000
0022FED9”,在地址为“0022FED9”的地方放了一个字符“S”,这个“S”就是指针“pointer”指向的数据,且通过“*pointer”这种写法来获取“S”,从某种意义上来说:
pointer 等于 0022FED9;
*pointer等于“S”,加上*号,就是直捣黄龙,拿到“S”。
此时我们可以说说第2点中提到的指针的类型是来修饰谁的问题了。在本例中,pointer的类型char显然不是来修饰“0022FED9”的,它是来告诉操作系统,我pointer认为“0022FED9”这个地方存放的是字符,是字符,是字符,且占1个BYTE的大小。
如果pointer的类型改为int,我pointer就认为“0022FED9”这个地方存放的是整数,是整数,是整数字符,且占4个BYTE的大小。
相关文章推荐
- C语言指针专题——如何理解指针
- C语言之指针专题三:理解指针要和内存四区模型和函数调用模型相结合
- 如何理解Perl语言中的Glob
- 编程语言:如何理解语言的跨平台性
- C语言指针方面的理解:(更新中)位对齐
- 如何理解指向指针的指针?
- 如何理解字符串赋值给指针与数组的区别
- 如何理解及定义指针 指针系列之二
- 如何理解指向指针的指针?
- 编译器是如何用汇编语言实现C++的虚函数表和隐式传递this指针(二)
- 编译器是如何用汇编语言实现C++的虚函数表和隐式传递this指针(一)
- 如何理解指向指针的指针
- c 语言函数传参的三种方式及二级指针的理解
- 【笔试面试知识点查缺补漏深入理解之C与C++篇】C/C++语言void及void指针深层探索
- 如何理解Java是跨平台的语言
- 编译器是如何用汇编语言实现C++的虚函数表和隐式传递this指针(三)
- c#对于如何释放资源的解释,又让我对此语言有更进一步的理解
- 如何理解数组作为函数参数时,数组名就是指针?
- 黑马程序员之c#学习笔记:如何理解C#中的指针
- 问题:如何理解指向指针的指针?