明次 发表于 2009-10-2 21:36

C++数组速学

1.一维数组的定义与初始化

1.1定义一维数组

int a;

该定义表示一个整型数组,共有3个元素,下标分别为,,。

1.2一维数组初始化

可以用下面几种方式进行初始化。

①在定义数组时分别对数组元素赋初值。

int a={0,1,2};

②只给一部分元素赋值。

int a={0,1};

这表示只给前面两个元素赋初值,后面的元素值默认为0。

③在对全部数组元素赋初值时,可以不指定数组长度。

int a={0,1,2};

可以写成

int a[]={0,1,2};

在第二种写法中,花括号中有3个元素,系统就会据此自动定义a数组的长度为3。但若被定义的数组长度与提供初值的个数不相同,则数组长度不能省略。

2.二维数组的定义与初始化

2.1定义二维数组

int a;

改定义表示一个3x4(3行4列)的整型数组。可以把该二维数组看作:

|---a:a,a,a,a

a |--a :a,a,a,a

|--a :a,a,a,a

C++中,二维数组种元素排列的顺序是:按行存放,即在内存中先顺序存放第一行的元素,在存放第二行元素,依次往下。

2.2二维数组初始化

可以用下面几种方式进行初始化。

①分行给二维数组赋初值。

int a={{0,1,2,3},{4,5,6,7},{8,9,10,11}};

②将所有数据写在一个花括号内,按数组排列的顺序对各元素赋初值。

int a={0,1,2,3,4,5,6,7,8,9,10,11};

③只对部分元素赋初值。

int a={{1},{2},{4}};

1 0 0 0

2 0 0 0

4 0 0 0

int a={{1},{0,2},{0,0,4}};

1 0 0 0

0 2 0 0

0 0 4 0

int a={{1},{3,2}};

1 0 0 0

3 2 0 0

0 0 0 0

int a={{1},{},{9}};

1 0 0 0

0 0 0 0

9 0 0 0

④如果对全部元素赋初值,则定义数组时对第一维长度可以不指定,但第二维长度必须指定。

int a={0,1,2,3,4,5,6,7,8,9,10,11};

可以写成

int a[]={0,1,2,3,4,5,6,7,8,9,10,11};

在定义时也可以对部分元素赋初值而省略第一维的长度,但应分行赋初值。

int a[]={{0,0,1},{},{0,9}};

0 0 1 0

0 0 0 0

0 9 0 0

3.用数组名作函数参数

3.1一维数组名作函数参数

数组名代表数组首元素的地址,并不代表数组中的全部元素。因此用数组名作函数参数时,是将实参数组首元素的地址传递给形参。形参可以是数组名,也可以是指针变量,它们用来接收实参传来的地址。如果形参是数组名,它代表的是形参数组首元素的地址。

在调用函数时,将实参数组首元素的地址传递给形参数组名。这样,实参数组和形参数组共占同一段内存单元。形参数组中各元素的值如果发生变化就意味着实参数组元素的值发生变化。这一点区别于变量作函数参数的情况。在变量作函数参数时,只能将实参变量的值传递给形参变量,在调用函数过程中如果改变了形参的值,对实参没有影响,即实参的值不因形参的值的改变而改变。

实际上,声明形参数组并不意味着真正建立一个包含若干元素的数组,在调用函数时也不对它分配内存单元,只是用array[]这样的形式表示array是一维数组名,以接受实参传来的地址。因此array[]中方括号内的数值并无实际作用,编译系统对一维数组方括号内的内容不予处理。函数定义中的形参数组可以写元素个数,也可以不写。

以下几种写法都是正确的。

void select_sort(int array,int n){…}

void select_sort(int array[],int n){…}

void select_sort(int array,int n){…}

C++实际上只把形参数组名作为一个指针变量来处理,用来接收从实参传过来的地址。

3.2二维数组名作函数参数

如果是二维数组名作为实参和形参,在对形参数组声明时,必须指定第二维(列)的大小,且应与实参的第二维的大小相同。第一维的大小可以指定,也可以不指定。

下面两种写法都是正确的。

void max_value(int array{…}

void max_value(int array[]){…}

不能把第二维的大小省略是因为,二维数组是由若干个一维数组组成的,在内存中数组是按行存放的,因此在定义二维数组时必须指定列数。假如一个二维数组有12个元素,可以是2x6,3x4,4x3,等不同的形式,如果指定了列数有4,则只有一种形式3x4。

形参数组的列(第二维)定义必须与实参数组的列(第二维)定义相同,但行(第一维)定义可以不同。

//实参

int array

//形参

int array

int array

4.字符数组

4.1字符数组的定义与初始化

可以这样定义:

char c;

c='I';c=' ';c='a';c='m';c=' ';

c='h';c='a';c='p';c='p';c='y';

也可以:

char c1={'I',' ','a','m',' ','h','a','p','p','y'};

如果花括号提供的初始个数(即字符个数)大于数组长度,则按语法错误处理。如果初值个数小于数组长度,则只将这些字符赋给数组中前面的元素,其余的元素自动定为空字符(即’’)。

如果提供的初值个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数确定数组长度。如,

char c1[]={'I',' ','a','m',' ','h','a','p','p','y'};

数组c的长度自动设定为10。

4.2字符数组的赋值与引用

只能对字符数组的元素赋值,而不能用赋值语句对整个数组赋值。

char c;

c={'C','H','I','N','A'};//error

c='C';c='H';c='I';c='N';c='A';//ok

如果已定义了a和b是具有相同类型和长度的数组,且b数组已被初始化,

a=b;//error

a=b;//ok

4.3 字符串和字符串结束标志

对于,

char str={'I',' ','a','m',' ','h','a','p','p','y'};

字符串str只有10个字符,所以系统会对字符数组最后两位自动填补’’,这是“字符串结束标志”。在上面的数组中,第11个字符为’’,就表明字符串的有效字符为其前面的10个字符。也就是说,遇到字符’’就表示字符串就此结束。

对一个字符串常量,系统会自动在所有字符的后面加一个’’作为结束符。例如字符串”I am happy”共有10个字符,但内存中它共占11个字节,最后一个字节’’是系统自动加上的。

在程序中往往依靠检测’’的位置来判定字符串是否结束,而不是根据数组的长度来决定字符串长度。

下面用字符串常量来初始化字符数组,

char str[]={"I am happy"};

也可以

char str[]="I am happy";

注意字符串的两端是用双引号而不是单引号。这里str数组的长度为11,因为系统在最后自动加上一个’’。上面的初始化等价于

char str[]={'I',' ','a','m',' ','h','a','p','p','y', ''};

而不等价于

char str[]={'I',' ','a','m',' ','h','a','p','p','y'};

需要说明的是,字符数组并不要求它的最后一个字符为’’。下面的写法是合法的(最后没有’’),

char str={'C','H','I','N','A'};

char str[]={'C','H','I','N','A'};

是否加’’是选择性的,而C++编译系统会对字符串常量自动加一个’’,因此为了使处理方法一致,便于测定字符串的实际长度,推荐人为加上’’,即

char str={'C','H','I','N','A',''};

char str={'C','H','I','N','A'};

char str[]={'C','H','I','N','A',''};

5.字符串数组

string name;//定义一个字符串数组,包含个字符串元素

string name={"Jeff","Tom","Ada","Mike","Bill"};//定义一个字符串数组并初始化

每个字符串元素中只包含字符串本身的字符而不包括’’;

在本例中,就是把字符串”Jeff”的地址存放在name, 把字符串”Tom”的地址存放在name, 把字符串”Ada”的地址存放在name, 把字符串”Mike”的地址存放在name, 把字符串”Bill”的地址存放在name。

zapline 发表于 2009-10-2 23:18

:lol怪不得你学这么快

假面泰山 发表于 2009-10-3 00:10

看看 还不错支持一下。谢谢分享。

jpeg2000 发表于 2009-10-4 15:50

回错帖了:dizzy:
页: [1]
查看完整版本: C++数组速学