[C++]数组

数组

一维数组的定义和引用

数组是同一类型的一组值(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)运行到光标处,可以直接使程序运行到光标处再进行单步调试,这种方法可以不必运行正确的循环而直接到有疑问的地方。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值