设为首页 加入收藏

TOP

4.8.3 指针和字符串(2)
2013-10-07 15:40:14 来源: 作者: 【 】 浏览:83
Tags:4.8.3 指针 字符串

4.8.3  指针和字符串(2)

记住,"wren"实际表示的是字符串的地址,因此这条语句将"wren"的地址赋给了bird指针。(一般来说,编译器在内存留出一些空间,以存储程序源代码中所有用引号括起的字符串,并将每个被存储的字符串与其地址关联起来。)这意味着可以像使用字符串"wren"那样使用指针bird,如下面的示例所示:

 

字符串字面值是常量,这就是为什么代码在声明中使用关键字const的原因。以这种方式使用const意味着可以用bird来访问字符串,但不能修改它。第7章将详细介绍const指针。最后,指针ps未被初始化,因此不指向任何字符串(正如您知道的,这通常是个坏主意,这里也不例外)。

接下来,程序说明了这样一点,即对于cout来说,使用数组名animal和指针bird是一样的。毕竟,它们都是字符串的地址,cout将显示存储在这两个地址上的两个字符串("bear"和"wren")。如果激活错误地显示ps的代码,则将可能显示一个空行、一堆乱码,或者程序将崩溃。创建未初始化的指针有点像签发空头支票:无法控制它将被如何使用。

对于输入,情况有点不同。只要输入比较短,能够被存储在数组中,则使用数组animal进行输入将是安全的。然而,使用bird来进行输入并不合适:

有些编译器将字符串字面值视为只读常量,如果试图修改它们,将导致运行阶段错误。在C++(www.cppentry.com)中,字符串字面值都将被视为常量,但并不是所有的编译器都对以前的行为做了这样的修改。

有些编译器只使用字符串字面值的一个副本来表示程序中所有的该字面值。

下面讨论一下第二点。C++(www.cppentry.com)不能保证字符串字面值被唯一地存储。也就是说,如果在程序中多次使用了字符串字面值"wren",则编译器将可能存储该字符串的多个副本,也可能只存储一个副本。如果是后面一种情况,则将bird设置为指向一个"wren",将使它只是指向该字符串的唯一一个副本。将值读入一个字符串可能会影响被认为是独立的、位于其他地方的字符串。无论如何,由于bird指针被声明为const,因此编译器将禁止改变bird指向的位置中的内容。

试图将信息读入ps指向的位置将更糟。由于ps没有被初始化,因此并不知道信息将被存储在哪里,这甚至可能改写内存中的信息。幸运的是,要避免这种问题很容易-只要使用足够大的char数组来接收输入即可。请不要使用字符串常量或未被初始化的指针来接收输入。为避免这些问题,也可以使用std::string对象,而不是数组。

警告:在将字符串读入程序时,应使用已分配的内存地址。该地址可以是数组名,也可以是使用new初始化过的指针。

接下来,请注意下述代码完成的工作:

 

它将生成下面的输出:

 

一般来说,如果给cout提供一个指针,它将打印地址。但如果指针的类型为char *,则cout将显示指向的字符串。如果要显示的是字符串的地址,则必须将这种指针强制转换为另一种指针类型,如int *(上面的代码就是这样做的)。因此,ps显示为字符串"fox",而(int *)ps显示为该字符串的地址。注意,将animal赋给ps并不会复制字符串,而只是复制地址。这样,这两个指针将指向相同的内存单元和字符串。

要获得字符串的副本,还需要做其他工作。首先,需要分配内存来存储该字符串,这可以通过声明另一个数组或使用new来完成。后一种方法使得能够根据字符串的长度来指定所需的空间:

 

字符串"fox"不能填满整个animal数组,因此这样做浪费了空间。上述代码使用strlen( )来确定字符串的长度,并将它加1来获得包含空字符时该字符串的长度。随后,程序使用new来分配刚好足够存储该字符串的空间。

接下来,需要将animal数组中的字符串复制到新分配的空间中。将animal赋给ps是不可行的,因为这样只能修改存储在ps中的地址,从而失去程序访问新分配内存的唯一途径。需要使用库函数strcpy( ):

 


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇4.8.3 指针和字符串(3) 下一篇4.8.3 指针和字符串(1)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C语言中如何将结构体 (2025-12-24 22:20:09)
·纯C语言结构体成员变 (2025-12-24 22:20:06)
·C语言中,指针函数和 (2025-12-24 22:20:03)
·哈希表 - 菜鸟教程 (2025-12-24 20:18:55)
·MySQL存储引擎InnoDB (2025-12-24 20:18:53)