C++程序设计:数组与指针的等价表示

需积分: 16 0 下载量 70 浏览量 更新于2024-08-19 收藏 8.66MB PPT 举报
"这篇PPT源自《C++程序设计》一书,由谭浩强编著,清华大学出版社出版。内容涵盖了C++语言的基础知识,包括C++的发展历史、C语言的特点以及C++对C语言的扩展。" 在C++编程中,数组和指针的使用是非常关键的一部分,题目中提到了四种不同的数组和指针定义方式,让我们逐一分析它们的含义: 1. `char s[3][5]={"aaaa","bbbb","cccc"};` 这是一个二维字符数组,它定义了3个长度为5的字符数组,每个数组存储一个字符串。实际上,由于字符串常量末尾自动添加的空字符`\0`,每个字符串实际占用6个字符空间,但这里只分配了5个,因此最后一个字符串"cccc"可能无法完整存储。 2. `char **s1={"aaaa","bbbb","cccc"};` 这是一个指向指针的指针,s1是一个指针,它指向一个指针数组,该数组包含3个元素,每个元素都是一个指向字符的指针。这个定义方式并不等同于上面的二维数组,因为它没有为每个字符串分配空间,而是直接指向了字符串常量的内存地址。 3. `char *s2[3]={"aaaa","bbbb","cccc"};` 这是一个字符指针数组,s2是一个数组,包含3个元素,每个元素是一个字符指针,分别指向了三个字符串常量的首地址。这种方式与前面的二维数组定义是等价的,因为每个元素都指向了独立的内存空间,存储了完整的字符串。 4. `char s3[][3]={"aaaa","bbbb","cccc"};` 和 `char s4[][4]={"aaaa","bbbb","cccc"};` 这两个定义有些微妙的区别。s3是一个未指定长度的二维数组,编译器会根据初始化的字符串长度自动推断列数,这里由于"aaaa"的长度,它会被推断为3列。而s4则明确指定了每个子数组有4个元素,但由于"cccc"只有3个字符,所以最后一个字符串后面会有一个未使用的空位。 总结来说,等价于原始二维数组`char s[3][5]`的是`char *s2[3]`,因为它们都为每个字符串分配了足够的空间。其他定义则有不同的内存布局和使用方式。理解这些概念对于进行C++编程至关重要,特别是涉及到动态内存分配、指针操作和数组处理时。