凌乱的指针与数组.pdfVIP

  • 3
  • 0
  • 约3.91万字
  • 约 29页
  • 2017-08-04 发布于天津
  • 举报
凌乱的指针与数组.pdf

凌乱的指针与数组 mengyingchina@163.com 0 C语言的灵魂?!-2- 1 指针与地址-2- 2 指针与函数参数-4- 3 指针与数组-6- 4 地址算术运算-8- 5 字符指针与函数-10- 6 指针数组以及指向指针的指针-13- 7 多维数组-16- 8 指针数组的初始化-17- 9 指针与多维数组-18- 10 命令行参数-19- 11 指向函数的指针-20- 12 复杂声明-23- 13 令人震惊的事实:数组和指针并不相同-24- 13.1 数组并非指针-24- 13.2 数组与指针的区别-25- 13.3 为什么会发生混淆?-25- 13.4 什么时候指针和数组是相同的?-26- 13.5 为什么把数组形参当成指针-28- 13.6 数组和指针可交换性总结-28- 14 结束语-29- 15 参考资料-29- C语言诡异离奇,缺陷重重,却获得了巨大的成功。 ——DennisRitchie 0 C 0 C 00 CC 语言的灵魂?! 指针是一种保存变量地址的变量。 指针并不是因为C 语言才有的。寻址、执行这么一个过程就是计算机的基本原理。尽 管很多高级语言都没有指针,但程序的运行就是靠着不停的寻址来运行的。可执行的机器码、 全局变量、局部变量和程序返回地址等这三块二进制数都存放在内存中。而只有cpu具有计 算功能,他的计算实际上非常弱,每次只能算一个非常简单的算术运算或逻辑运算(但运算 速度惊人)。要把程序代码和变量从内存传到cpu就需要通过找寻数据在内存中的地址,然 后通过数据总线和地址总线传进 cpu运算。所以如果你了解了程序的运行机制就可以根据 地址去做很多很灵活甚至是很诡异的操作。不仅如此,你想做的所有操 作也都离不开地址。 即使让你自己去设计一个语言,你会发现,类似指针这么个概念也是不可缺少的,离开它计 算机就无法工作了。不知道是谁说的“指针是C 语言的灵魂”,确实如此。有些任务用其它 语言可以实现,但C 能够更有效的实现;有些任务无法用其它语言实现,如直接访问硬件, 但C 却可以。Pascal语言的指针哲学有点类似这样的说法:使用锤子可能会伤着你自己,所以 我们不给你锤子。C语言的指针哲学是:“给你锤子,实际上你还可以用好几种锤子。但祝 你好运!”。也就是说,C指针给我们足够的灵活性来获得代码上效率的提升,但同时要承 担相应的风险。 指针和数组之间的关系十分密切,我们将讨论它们之间的关系,并探讨如何利用这种关 系。 1 1 11 指针与地址 我们在这里假定x 与y 是整数,而ip 是指向int 类型的指针,下面的代码段说明了 如何在程序中声明指针以及如何使用运算符和*: int x = 1, y = 2, z[10]; int *ip; /* ip is a pointer to int */ ip = x; /* ip now points to x */ y = *ip; /* y is now 1 */ *ip = 0; /* x is now 0 */ ip = z[0]; /* ip now points to z[0] */ 我们应该注意,指针只能指向某种特定类型的对象,也就是说,每个指针都必须指向某 种特定的数据类型。(一个例外情况是指向void 类型的指针可以存放指向任何类型的指针, 但它不能间接引用其自身。) 最后说明一点,由于指针也是变量,所以在程序中可以直接使用,而不必通过间接引用 的方法使用。例如,如果iq是另一个指向整型的指针,那么语句 iq = ip 将把 中的值拷贝到 中,这样,指针 也将指向 指向的对象。 ip iq iq ip 下面通过分析C程序的机器级实现来更好的理解指针与地址的关系。 -2 - 考虑下面所示的数据交换函数,既有C

文档评论(0)

1亿VIP精品文档

相关文档