《C和C++代码精粹》——2.9 字符串数组-阿里云开发者社区

开发者社区> 人工智能> 正文

《C和C++代码精粹》——2.9 字符串数组

简介:

本节书摘来自异步社区出版社《C和C++代码精粹》一书中的第2章,第2.9节,作者: 【美】Chuck Allison,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.9 字符串数组

C和C++代码精粹
有两种方式来描述C风格的字符串数组:(1)指针数组;(2)二维数组。程序清单2.13中的程序说明了第一种方式。内存分布如下:
image

程序清单2.13 用指向字符的指针数组来实现字符串

// array6.cpp:粗糙的数组  
#include <iostream>  
#include <cstring>  
using namespace std;  

main()  
{  
    char*  strings[] = {"now","is","the","time"};  
    size_t n = sizeof strings / sizeof strings[0];  

    //从粗糙的数组打印  
    for (int i = 0; i < n; ++i)  
        cout << "String " << i  <<" == \"" << strings[i]  
             << "\",\tsize == " << sizeof strings[i]  
             << ",\tlength == " << strlen(strings[i])  
             << endl;  
}  

//输出:  
String 0 == "now",   size == 4,   length == 3  
String 1 == "is",    size == 4,   length == 2  
String 2 == "the",   size == 4,   length == 3  
String 3 == "time",  size == 4,   length == 4

由于字符串可以有不同的长度,所以这一类型的数组有时被称为粗糙的(ragged)数组。这一方式仅使用了容纳数据所需的内存数量,再加上指向每个字符串的指针。运行时系统传递给main函数的命令行参数数组argv是一个粗糙的数组。

粗糙的数组方式的一个不利之处是,在大多数环境中,需要动态地为每个字符串分配内存(参见第20章)。如果你不介意浪费一小部分空间,而且如果你也知道会遇到的最长的字符串的长度,就可以使用一个固定大小的区域来存储二维字符数组(每行一个字符串)。程序清单2.14中数组的内存区域分布如下:

image

程序清单2.14 作为二维字符数组中的行来实现字符串

// array7.cpp: 在二维字符数组中存储字符串  
#include <iostream>  
#include <cstring>  
using namespace std;  

main()  
{  
    char array[][5] = {"now","is","the","time"};  
    size_t n = sizeof array / sizeof array[0];  

    for (int i = 0; i < n; ++i)  
        cout << "array[" << i << "] == \"" << array[i]  
             << "\",\tsize == " << sizeof array[i]  
             << ",\tlength == " << strlen(array[i])  
             << endl;  
}  

//输出:  
array[0] == "now",   size == 5,   length == 3  
array[1] == "is",    size == 5,   length == 2  
array[2] == "the",   size == 5,   length == 3  
array[3] == "time",  size == 5,   length == 4

正如这个程序所表明的,如果多维数组的第一维能从它的初始化中推断出来,那么就不必具体指出多维数组的第一维。

在程序设计语言中C++在某种程度上是独一无二的,因为在使用数组时仅可以使用其部分下标。就像程序清单2.14中的程序所使用的那样,表达式array[i]是指向第i行的指针。对于一个定义为int a2[4]的数组,a[i]代表的是什么呢?而ai又是什么呢?请继续读下一节。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
人工智能
使用钉钉扫一扫加入圈子
+ 订阅

了解行业+人工智能最先进的技术和实践,参与行业+人工智能实践项目

其他文章