何为指针(一)认识指针

Pointers or C 英文版翻译

原文:3.1.3 Pointers


指针是C语言非常流行的主要原因。指针可以高效的实现一些高级的数据结构,例如树和链表等等。例如像Pascal和 Modula-2 这些语言,虽然实现了指针,但是不允许指针的算术或者比较运算。这些语言也不允许创建已经存在对象的指针。幸运的是C程序员可以使用这些限制去编写比其他语言更加高效和简洁的程序。同时,没有限制的使用C指针也使C程序员痛哭流涕,不管是小白还是经验丰富的老司机
->>>>>>>>
变量的值储存在计算机内存中的特定位置。内存中的每个位置通过地址来识别和引用,就像通过地址来定位街道上的房子一样。指针仅仅是地址的一个别名;指针变量是一个值为其他一些内存位置地址的变量。有运算符可以取一个变量的地址并且跟踪指针指向的变量或者数据结构。
->>>>>>>>
使用地址读取数据代替使用他的名字读取数据的这种做法经常造成困惑。这其实是不应该的,因为在你的生活中也是这样做的。这和使用地址来定位街道上的房子是一样的。没有人会混淆房子的地址和房子的名字。没有人会在写信是错误的写成给住址为“张三”的“XXX小区110号”的信。
->>>>>>>>
指针也是同样的。想象一下计算机内存就像沿着很长的街道布局的房子,每块内存使用一个唯一的数字标识。每块内存中储存这一个和地址没有多大关联的值,尽管这个值也是一个数字。

指针字面常量

指针常量根本不同于非指针常量。因为编译器负责为变量在计算机内存中分配位置,而程序员是没办法事先知道变量具体放在哪里。因此,使用操作符来获取变量的地址比直接写成像字面值一样的地址好的多。举个栗子,如果我们想要变量XYZ的地址,我们不可以直接写成像”0Xff20044ec”这样的字面值,因为我们没法知道编译器将在哪里放入变量。事实上,在每次函数被调用时一个自动变量可能被分配到不同的地方。因此,很少使用像数字字面值一样的指针字面常量表达式,所以在C语言中也没有为他构建特殊的标识符。(注意:UNLL 指针可以使用 0 值表示)

字符串字面值

很多人会觉得奇怪C语言中没有string类型(字符串类型),然而C语言有字符串字面值。事实上是有字符串的概念的,它是以NUL字节(空字节)终止的由一个零或者多个字符构成的一个序列。字符串通常是存在字符数组中的,这就是没什么C语言没有显式的提供字符串类型的原因。因为nul被用来做字符串的结尾,所以字符串中不可能包含nul。然而这个规定通常情况是没有问题的,;unl之所以被选来作为终止符是因为没有与之相关的可打印的图形。
->>>>>>>>
字符串字面值是被引号括起来的字符序列。像下面这样:

"hello world" "Line 1\nLine 2"

ANSI C 指出修改字符串字面值的影响是没有定义的。它允许编译器只储存一次字符串字面值,尽管其在源码中多次出现。实际在程序中上修改字符串字面值是极度的危险的,因为修改一个字符可能改变其他字符字面值。因此,许多编译器不让你修改字符串字面值,或者提供编译时选项,让你选择是否允许修该字符串字面值。为了避免这些麻烦,如果你需要修改字符串,可以使用数组储存它。
->>>>>>>>
我讨论指针顺便讨论字符串是因为在程序中使用一个指针时生成一个“指针常量值”,当一个字符串常量值在一个表达式中出现时,表达式中使用的值是储存字符的地址,而不是字符本身。因此,你可以把字符串常量赋值给一个字符型指针变量,使这个变量指向字符储存的地址。然而你不能将字符串字面值赋值给一个字符数组,因为字面值的立即值是一个指针,而不是他本身。
->>>>>>>>
如果你听到字符串不能被赋值或者拷贝觉得很不方便,那么你应该知道C标准库包含了一套用来操作字符串的函数。这些函数包括拷贝、连接、比较、计算字符串长度和查找字符串中特定字符。


    译者:小风code                          时间:2017-11-1

未完待续…

猜你喜欢

转载自blog.csdn.net/qq_33775402/article/details/78417193