第3章 数组、指针和字符串
在程序设计中,常把具有相同类型的若干变量按有序的形式组织起来,这些同类数据元素的集合就称为数组。在C++中,字符串也可以看成是由一系列字符组成的数组。作为C++程序中一个得力的工具,通过指针我们可以方便地访问变量、数组以及数组中的数组元素。
3.1
C++中的数组
3.1.1 问题描述
谁能帮忙看一下,下面的代码为什么不能通过编译?
int n=5;
int a[n];
for(int i=0;i<n;i++)
a[i]=i;
3.1.2 解决方法
你声明数组的方式错了,因为数组在声明就需要分配固定大小的内存空间,这样指定数组的元素个数必须一个常量。而你的程序试图用变量n来指定元素的个数,但变量n在编译时n的值是未知的,编译器将无法确定为数组分配的内存空间。可以在变量n前添加const修饰符声明为常量,例如:
const int n=5;
int a[n];
这样你的程序就应该没问题了。
3.1.3 知识扩展——声明数组
数组就是可以存储同一类型的多个数据的内存空间。在数组中的所有数据都通过相同的数组名来使用。在C++中定义数组一般形式为:
类型名 数组名 [常量表达式];
其中,类型名可以是任一种基本数据类型。数组名是用户定义的数组标识符。方括号中的常量表达式表示数据元素的个数,也称为数组的长度。例如:
int a[10]; // 声明整型数组a,它有10个元素。
float b[20]; // 声明实型数组b,它有20个元素。
char ch[20]; // 声明字符数组ch,它有20个元素。
3.2
访问C++数组问题
3.2.1 问题描述
请教各位高手,下面程序的输出结果是什么:
#include <iostream>
using namespace std;
int main()
{
int p[8]={ 11,12,13,14,15,16,17,18},i=0,j=0;
while(i++<7) //遍历数组,取数组中奇数之和
if(p[i] % 2) //判断数组元素是否为奇数
j+=p[i];
cout<<j<<endl;
return 0;
}
程序运行后的输出结果是:
A)42 B)45 C)56 D)60
3.2.2 解决方法
正确结果应该是(B)45。在这个程序中我们应该注意数组索引i的变化情况:1、2、…7,而对应的数组元素不能被2整除的有:13、15、17,这几个数的和为45。
3.2.3 知识扩展——初始化数组
在定义数组时可以对其进行初始化,使其包含程序中马上能使用的值。对数组进行初始化时,应该在大括号中提供各个数组元素的初始值。例如,下面的语句定义并初始化一个数组:
int a[10]={1,2,3,4,5,6,7,8,9,10};
大括号中的值对应于数组中连续的数组元素。对于上面的语句,数组元素a[0]的值是1,数组元素a[1]的值是2,依此类推。
如果在定义数组时提供了初始化值,还可以省略数组的大小,这时数组的元素个数与初始化值的个数相同。例如,下面的语句为数组定义了5个元素:
int a[]={2,4,6,8,10};
可以使用sizeof运算符来计算数组的大小。sizeof运算符以字节形式给出了其操作数占用存储空间的大小。例如,定义了如下一个数组:
int values[]={2,4,6,8,10,12};
表达式sizeof values会计算出整个数组占用的字节数,表达式sizeof values[0]则计算出一个元素占用的字节数。因此表达式sizeof values/sizeof values[0]就等于数组中的元素个数。下面的代码使用sizeof确定数组的大小:
//获取数组元素个数
#include <iostream>
#include <iomanip>
using std::cout;
using std::endl;
using std::setw;
int main()
{
int values[]={2,4,6,8,10,12};
cout<<"数组values[]具有"
<<sizeof values/sizeof values[0]<<"个元素"<<endl;
for(int i=0;i<sizeof values/sizeof values[0];i++)
cout<<setw(5)<<values[i];
cout<<endl;
return 0;
}
如果增删初始化数组的初始化列表数,运算符sizeof会自动调整循环执行次数,这样只需要重新编译即可,其他内容无须改动。
在引用数组元素时,需要注意C++数组的索引值(下标)是从0开始的。下面的代码存在一个严重的错误。
……