C语言基础-指针篇
文章平均质量分 75
ipmux
这个作者很懒,什么都没留下…
展开
-
指针篇之二 刘先生您贵姓
指针之所以比普通变量复杂,主要在于它多了一个指向,或者说指针所包含的内容是“买一送一”的,明处的“一”是指针本身这个变量,而暗地里隐含的“一”是指针所指向的内存。如果忽略了后者,一些似是而非的说法就会让指针的概念模糊不清。 变量都有类型,于是很多人也会问:“这个指针是什么类型?”,这个问题看似普通,大家也都习以为常,但它相当于在问“刘先生,您贵姓?”。指针变量的类型就是指针型,如同int原创 2013-12-07 23:39:31 · 941 阅读 · 0 评论 -
指针篇之十二 函数指针数组实现跳转表
函数跳转表是把函数指针和数组结合在一起的应用方式,它充分利用数组的下标索引和函数指针的自动跳转功能,实现用户输入和功能函数的自动关联。比如一个软件计算器,用户输入两个数(op1/op2)和一个操作代号(oper),代码根据约定的代号/操作映射关系,决定调用哪种运算。常规实现方式为: switch(oper) { case ADD: result=add(op1,op原创 2013-12-13 11:27:31 · 2414 阅读 · 0 评论 -
指针篇之十三 函数指针精彩回调
回调函数定义 回调是通过函数参数传递到其它代码内的某一段可执行代码。或者说,凡是自己定义又主动传给其他模块调用的,都是回调。回调允许底层模块调用高层定义的子程序。 理解回调首先要明白什么是层次/模块,软件模块是广义概念,可以包括功能库(也称SDK)、C++对象、组件以及操作系统等,但所有这些最终基本都可以归结为函数实体库。因此下文中上层模块就是指库的调用方(caller原创 2013-12-13 13:03:47 · 1652 阅读 · 0 评论 -
指针篇之十一 函数指针
程序包含指令段和数据段,各自占用存储空间,有相应地址。函数可看作一组代表指令的二进制数集合,因此也能用指针指向和访问。函数指针就是指向可执行代码段中的某函数入口地址的指针,通过它可以把函数当成普通数据那样存储访问甚至移动拷贝。 函数指针定义为:返回值类型(*指针变量名)(形参列表);如:int (*f)(int x);注意形似的int *f(int x)代表返回值为指针的普通函数。函原创 2013-12-13 11:13:29 · 1183 阅读 · 0 评论 -
指针篇之一 宝藏与藏宝图
很多电影里都有这样的情节:某人得到一大笔宝藏后,绘制了一张藏宝图,为争夺这张藏宝图,引发了一系列故事。从这个老套桥段里,可以总结出一些隐含的东西: 1. 为什么要有藏宝图?因为宝藏体积重量大,不方便随身携带;而藏宝图轻巧可携带。 2. 得到藏宝图,基本就能得到宝藏。所以藏宝图≈宝藏。 3. 藏宝图只是一张纸,做为载体的纸一文不值。它的价值完全体现在纸原创 2013-12-07 23:31:35 · 1396 阅读 · 1 评论 -
指针篇之十 传递指针共享内存
受硬件工艺制约,CPU访问外部内存的速度远远慢于寄存器以及片上内存,常常成为程序性能的最大瓶颈。而指针作为内存间接访问的索引,可实现内存共享机制,代替内存间的大数据搬运和拷贝。打个粗俗的比方,小孩在家里随地大小便,大人每次都要在后面处理,这时真希望他会蹲马桶啊!第一步一定是告诉并让他记住马桶在哪里,否则一旦既成事实,臭臭落地,就只能“拷贝搬运”了。所以,马桶的位置就是指针!函数调用链上的多余中原创 2013-12-09 15:20:31 · 3504 阅读 · 0 评论 -
指针篇之九 顺藤摸瓜式的指针数据链接
大科学家阿基米德曾说给他一根杠杆,就可以撬动整个地球,只要这根杠杆够长,够结实。同样,C语言编程时,掌握一个起始指针,加上合适的数据结构,就可以串起程序所需的所有数据。使用时只要拿到这根数据链的手柄(即起始指针),就能遍历访问链上的所有信息,这是指针的另一个作用:数据连接。在这种应用场合指针近似另一个概念--"句柄"。 英文"Handle"在计算机软件中译为"句柄"。广义上,如果能通过一原创 2013-12-09 14:21:16 · 998 阅读 · 0 评论 -
指针篇之八 函数的指针参数
C语言中有一条重要准则,函数参数按值传递,只传入不传出,比如: int test(char ca){ ca = 'b'; } void main() { char ca = 'a'; printf("before fun call, ca = %c",ca); test(ca); printf("after原创 2013-12-09 10:35:15 · 894 阅读 · 0 评论 -
指针篇之五 指针与数组 剪不断理还乱
数组和指针可以说是一对纠缠不清的冤家,下面是一些常见的关于数组和指针的说法:“一维数组是一级指针”;“二维数组是二级指针”;“数组名可以作指针用”;“数组名是常量指针”。 很遗憾,这些说法全部错误。数组名不是指针,也不存在什么常量指针!数组名代表一个地址,它可以作为右值赋给指针变量。至于指针与地址的关系,在第一篇最后已有说明。忘记了?回去看。 存放数组的区域是一块内存,数组原创 2013-12-08 22:18:51 · 1037 阅读 · 0 评论 -
指针篇之六 指针与结构体,小心刻舟求剑
指针与结构没有指针与数组的关系那么复杂,却也有一些需要注意的地方。例如: typedef struct { int a; int b; int c; } MyStruct; MyStruct ss={20,30,40}; //声明对象ss,三个成员初始化 MyStruct *ptr=&原创 2013-12-08 22:42:48 · 1443 阅读 · 0 评论 -
指针篇之四 借你一双慧眼,把它类型看个清楚明白
指针可以指向各种内存元素类型,因而存在变化多样的语法定义,靠死记硬背难以分辨,特别是一些复杂及嵌套定义。要弄清指针到底指向什么类型的内存变量,有个小窍门:把指针声明中的指针变量名和之前的指针声明符*去掉,剩下的就是指针所指内存的类型。比如: int *ptr; //去掉 *ptr,指针所指内存的类型是int char *ptr; //指针所指向的内存类型是char原创 2013-12-08 21:55:21 · 1032 阅读 · 0 评论 -
指针篇之三 一步有多远
指针的算术运算不象普通变量增大和减小那么简单,它意味着对物理内存的偏移访问,一旦步子跨得不对,后果就是非法访问甚至crash。所以指针运算有严格限制:它只允许加上或减去一个整数,而不允许加减变量以及乘除法操作。并且指针加减运算和通常的整数加减有所不同,比如: char a[20]; int *ptr=a; ptr = ptr +1; 注意,尽管原创 2013-12-08 21:34:45 · 986 阅读 · 1 评论 -
指针篇之七 看我七十二变
指针优点之一是能灵活读写内存,实现这一功能主要依靠灵活多变的类型转换,重复这里类型指指针所指向的内存的类型。通过改变编译器对“被指向内存”的解读方式实现对内存中数据的灵活转换,这是指针的精髓应用之一。 指针本身存储的值被编译器当作一个地址,这个值的类型,即指针所指内存块的类型尤为重要,”a pointer make no sense if it has no type definitio原创 2013-12-09 09:57:53 · 1083 阅读 · 0 评论