数组
一维数组的定义和引用
数组是同一类型的一组值(10个 char 或15个 int) ,在内存中顺序存放。
整个数组共用一个名字,而其中的每一项又称为一个元素。
一、定义方式:
其元素分别为:a[0], a[1], a[2], a[3]
其序号从0开始。若存放首地址为2000H,则在内存中为:
C++不允许对数组的大小作动态的定义,即数组的大小不能是变量,必须是常量。
如果要根据不同的数值改变数组的大小,可用常量表达式。如:
#define SIZE 50
void main(void)
{ int art[SIZE];
......
}
二、一维数组元素的引用
数组必须先定义,具体引用时(赋值、运算、输出)其元素等同于变量。
三、一维数组的初始化
在定义数组的同时给数组元素赋值。
注意:
1、对数组中的一部分元素列举初值,未赋值的部分是0。
int a[10]= {0,1, 2, 3, 4, 5};
int a[10]= {0,1, 2, 3, 4, 5, 0, 0, 0, 0};
2、不能给数组整体赋值,只能一个一个地赋值。
int a[10]= {0,1,2,.....,9};
int a[10]= {0,1, 2, 3, 4, 5,6,7,8,9};
3、可以用 int a[ ]= {0,1, 2, 3, 4, 5, 6, 7, 8, 9}; 给数组赋值,编译器会自动计算出内的元素项数,并将数组定义为该长度。
4、用局部static 或全局定义的数组不赋初值,系统均默认其为‘\0’。
static int a[10];(即存储在静态数据区中的数组其元素默认为0)
数组在内存中顺序存放,第一个元素位于地址的最低端。
二维数组的定义和引用
一、定义方式:
类型说明符 数组名[常量表达式][常量表达式];
其元素分别为:a[0][0], a[0][1], a[0][2], a[0][3],
a[1][0], a[1][1], a[1][2], a[1][3],
a[2][0], a[2][1], a[2][2], a[2][3]
其行列的序号均从0开始。若存放首地址为2000H,则在内存中为:
即在内存中,多维数组依然是直线顺序排列的,第一个元素位于最低地址处。
二、二维数组的引用
与一维数组一样,二维数组必须先定义,其维数必须是常量。具体引用时(赋值、运算、输出)其元素等同于变量。
三、二维数组的初始化
在定义数组的同时给数组元素赋值。即在编译阶段给数组所在的内存赋值。
1、分行赋值
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
2、顺序赋值
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; //依次赋值
3、部分赋值
int a[3][4]={{1},{5},{9}};
/* a[0][0]=1, a[1][0]=5, a[2][0]=9 其余元素为0 */
4、分行或全部赋值时,可以省略第一维,第二维不可省。
int a[ ][4]={{1,2},{5,6,7,8,}{9,10,11,12}};
5、不能给数组整体赋值,只能一个一个地赋值。
int a[2][3]={1,2,3,.....,12};
6、用static 定义的数组不赋初值,系统均默认其为‘\0’。
static int a[2][3];
数组作为函数参数
一、数组元素作函数参数
数组元素作函数实参,用法与一般变量作实参相同,是“值传递”。
二、用数组名作函数参数
在C++中,数组名被认为是数组在内存中存放的首地址。
用数组名作函数参数,实参与形参都应用数组名。这时,函数传递的是数组在内存中的地址。
实参中的数组地址传到形参中,实参形参共用同一段内存。
注意:
1、用数组名作函数参数,应在主调函数和被调函数中分别定义数组,且类型一致。
2、需指定实参数组大小,形参数组的大小可不指定。数组名作实参实际上是传递数组的首地址。
3、C++语言规定,数组名代表数组在内存中存储的首地址,这样,数组名作函数实参,实际上传递的是数组在内存中的首地址。实参和形参共占一段内存单元,形参数组中的值发生变化,也相当于实参数组中的值发生变化。
用多维数组名作函数参数
同样,实参向形参传递的是数组的首地址。
如果实参、形参是二维数组,则形参可以省略第一维,不可省略第二维,且第二维必须与实参中的维数相等。
字符数组
用来存放字符数据的数组是字符数组,字符数组中的一个元素存放一个字符。
一、字符数组的定义
二、字符数组的初始化
与数值数组的初始化相同,取其相应字符的ASCII值。
char c[10]={‘I’, ‘ ’, ‘a’, ‘m’, ‘ ’, ‘a’, ‘ ’ , ‘b’, ‘o’, ‘y’};
char st1[ ]={65, 66, 68};
如果字符个数大于数组长度,做错误处理;如果数值个数小于数组长度,后面的字节全部为‘\0’。
如果省略数组长度,则字符数即为数组长度。
static char c[ ]={‘I’, ‘ ’, ‘a’, ‘m’, ‘ ’, ‘a’, ‘ ’ , ‘g’, ‘i’, ‘r’,’l’};
同理,也可定义和初始化一个二维或多维的字符数组。分层或省略最后一维。
三、字符数组的引用
void main(void)
{ char c[10]={‘I’, ‘ ’, ‘a’, ‘m’, ‘ ’, ‘a’, ‘ ’ , ‘b’, ‘o’, ‘y’};
int i;
for (i=0; i<10; i++)
cout<<c[i];
cout<<“\n”;
}
四、字符串和字符串结束标志
C++语言将字符串作为字符数组来处理。
字符串常量:“CHINA”,在机内被处理成一个无名的字符型一维数组。
C++语言中约定用‘\0’作为字符串的结束标志,它占内存空间,但不计入串长度。有了结束标志‘\0’后,程序往往依据它判断字符串是否结束,而不是根据定义时设定的长度。
字符串与字符数组的区别:
字符数组:
char a[ ]={‘C’,’H’,’I’,’N’,’A’};
字符串:
char c[ ]=“CHINA”;
可以用字符串的形式为字符数组赋初值
char c[ ]={“I am a boy”}; /*长度11字节,以‘\0’结尾
char a[ ]={‘I’, ‘ ’, ‘a’, ‘m’, ‘ ’, ‘a’, ‘ ’ , ‘b’, ‘o’, ‘y’};
/* 长度10字节 */
如果数组定义的长度大于字符串的长度,后面均为‘\0’。
char c[10]=“CHINA”;
‘\0’的ASCII为0,而‘ ’(空格)的ASCII为32。
字符数组的输入输出
逐个字符的输入输出。这种输入输出的方法,通常是使用循环语句来实现的。如:
char str[10];
cout<<“输入十个字符:”;
for(int i=0;i<10;i++)
cin>>str[i];//A
......
A行将输入的十个字符依次送给数组str中的各个元素。
·把字符数组作为字符串输入输出。对于一维字符数组的输入,在cin中仅给出数组名;输
出时,在cout中也只给出数组名。
·当要把输入的一行作为一个字符串送到字符数组中时,则要使用函数cin.getline( )。这个
函数的第一个参数为字符数组名,第二个参数为允许输入的最大字符个数。
六、字符串处理函数
C++中没有对字符串变量进行赋值、合并、比较的运算符,但提供了许多字符串处理函数,用户可以调用 #include “string.h”
所有字符串处理函数的实参都是字符数组名
1、合并两个字符串的函数 strcat (str1, str2)
将第二个字符串 str2 接到第一个字符串 str1 后。
注意:第一个字符串要有足够的空间。
2、复制两个字符串的函数 strcpy (str1, str2)
static char str1[20]={“I am a ”};
static char str2[ ]={“boy”};
strcpy (str1, str2);
3、比较两个字符串的函数 strcmp (str1, str2)
此函数用来比较str1和str2中字符串的内容。函数对字符串中的ASCII字符逐个两两比较,直到遇到不同字符或‘\0’为止。函数值由两个对应字符相减而得。
该函数具有返回值,返回值是两字符串对应的第一个不同的ASCII码的差值。
若两个字符串完全相同,函数值为0。
4、求字符串长度的函数 strlen (str1)
函数参数为数组名,返回值为数组首字母到‘\0’的长度。并非数组在内存中空间的大小。
5、 strlwr (str1)
将str1中的大写字母转换成小写字母。
6、 strupr (str1)
将str1中的小写字母转换成大写字母。
7、函数strncmp(字符串1,字符串2 , maxlen)
函数原型为:
int strncmp(char str1[ ], char str2[ ],int m)
第三个参数为正整数,它限定了至多比较的字符个数
若字符串1或字符串2的长度小于maxlen的值时,函数的功能与strcmp( )相同。
当二个字符串的长度均大于maxlen的值时,maxlen为至多要比较的字符个数。
cout<<strncmp(“China”,“Chifjsl;kf”,3)<<‘\n’;
8、函数strncpy(字符数组名1, 字符串2, maxlen)
函数原型为:
void strncmp(char str1[ ], char str2[ ],int m)
第三个参数为正整数,它限定了至多拷贝的字符个数
若字符串2的长度小于maxlen的值时,函数的功能与strcpy( )相同。
当字符串2的长度大于maxlen的值时,maxlen为至多要拷贝的字符个数。
调试程序的方法:
1)单步调试:以行为单位,每运行一步,程序就会中断,可以实时查询目前各变量的状态及程序的走向。可以选择是否进入子函数。
2)运行到光标处,可以直接使程序运行到光标处再进行单步调试,这种方法可以不必运行正确的循环而直接到有疑问的地方。