c++ 数组

来源:互联网 发布:黑暗之魂3低配优化补丁 编辑:程序博客网 时间:2024/05/17 08:47

      数组的基础知识就不重复了,只挑了一些重点。

1、数组的声明及初始化

int array1[5];//声明
int array2[5= ...12 , 3 , 4 , 5};//声明并初始化
int array3[5= ...1};//如果初始化的值少于元素数量,那么剩余的元素将被隐式的初始化为0
int array4[] = ...1 , 2 , 3 , 4 , 5};//自动创建一个含有5个元素的数组,并且已经初始化为1,2 ,3,4,5

 

2、字符数组

      声明一个字符数组时,我们可以直接的用一个字符串来初始化,例如

char str[] = "string";

      要注意的是,此时str的长度是7而不是6,str[6]存储的是一个表示字符串结束的字符,即NULL字符,用常量表示就是'/0',反斜杠后面加一个数字0,以上声明也等价于

char str[] = {'s''t''r''i''n''g''/0'};

     特别的,当我们用数组来储存用户输入时,及其容易发生数组溢出情况,因为你不知道用户将要输入多少字符

char str2[10];
cin 
>> str2;
      此时程序将把用户的输入存储在str2中,并自动的在后面加上一个NULL,问题是程序不管用户到底输入了多少,我们只给出了数组的头元素地址,那么程序将从该地址开始,一直往下储存,而不管有没有到达数组的边界,这样的话极其容易造成数据丢失(因为用户输入的东西可能把有用的数据覆盖掉了),解决的办法就是使用setw流操作符
char str3[10];
cin 
>> setw(10)  >> str3;

      这样就指定了最多取用户的前9个字符,并且在末尾加上一个NULL字符。

      类似的cout函数也有此情况,它将从初始地址一直打印内存中的字符,直到遇到一个NULL字符,我们可以采取类似cin的办法来处理问题。

3、static 数组

      当我们需要在一个函数里保存局部数组的信息时,我们可以将其声明为static,这样当函数退出时,数组的信息将不会被删除

#include <iostream>

using std::cout;
using std::endl;

void staticArray(void);
void autoArray(void);

int main()
{
    cout 
<< "First call to each function:"<< endl;
    staticArray();
    autoArray();

    cout 
<<" Second call to each function:"<< endl;
    staticArray();
    autoArray();

    cout
<<endl;
    
return 1;
}

void staticArray()
{
    
static int array1[3];
    
int i;

    cout 
<< " Values on entering staticArray: ";
    
for(i = 0; i < 3; i++)
        cout 
<< "array1[" << i << "] = " <<array1[i] << " ";

    cout 
<< " Values on exiting staticArray: ";
    
for(i = 0; i < 3; i++)
        cout 
<< "array1[" << i << "] = " <<(array1[i] += 5<< " ";
}

void autoArray()
{
    
int array2[3= {123};
    
int i;

    cout 
<< " Values on entering autoArray: ";
    
for(i = 0; i < 3; i++)
        cout 
<< "array2[" << i << "] = " <<array2[i] << " ";

    cout 
<< " Values on exiting autoArray: ";
    
for(i = 0; i < 3; i++)
        cout 
<< "array2[" << i << "] = " <<(array2[i] += 5<< " ";
}

/*输出结果
First call to each function

Values on entering staticArray
array1[0] = 0 array1[1] = 0 array1[2] = 0
Values on exiting staticArray
array1[0] = 5 array1[1] = 5 array1[2] = 5

Values on entering autoArray
array2[0] = 1 array2[1] = 2 array2[2] = 3
Values on exiting autoArray
array2[0] = 6 array2[1] = 7 array2[2] = 8

Second call to each function

Values on entering staticArray
array1[0] = 5 array1[1] = 5 array1[2] = 5
Values on exiting staticArray
array1[0] = 10 array1[1] = 10 array1[2] = 10

Values on entering autoArray
array2[0] = 1 array2[1] = 2 array2[2] = 3
Values on exiting autoArray
array2[0] = 6 array2[1] = 7 array2[2] = 8
*/

      可见,声明为static的数组是在程序载入时初始化的,并且以后不再自动初始化。

4、传递数组给函数

      c++通过模拟“按引用调用”将数组传递给函数。数组名的值就是数组第一个元素的地址。因为c++不像java那样可以知道数组的大小,所以传递数组时通常要顺带传递一个数组长度。

void modifyArray(int a[], int sz)
{
    
int i;
    
for(i = 0;i < sz;i++)
        a[i] 
*= 2;
}

void modifyElement(int i)
{
    i 
*= 2;
}


int main()
{
    
const int size =3;
    
int array[size]= {1,2,3};
    printArray(array);

    modifyArray(array,size);
    printArray(array);

    modifyElement(array[
1]);
    printArray(array);
    
return 1;
}

/*输出结果
1 2 3
2 4 6
2 4 6
*/

      如果不希望函数修改数组的内容,那么可以想我们在“函数”里面一样使用const限定符。

5、多维数组

      多位数组跟一维数组有着类似的性质,重要的不同的地方是在析构函数时多维数组的删除问题,这再以后再讨论,下面仅仅讨论一下多维数组的初始化问题。

int main()
{
    
int array1[2][3= {1,2,3}{4,5,6}},
        array2[
2][3= 1,2,3,4},
        array3[
2][3= {1,2},{4}};
    printArray(array1);
    printArray(array2);
    printArray(array3);
    
return 1;
}

/*输出结果
1 2 3
4 5 6

1 2 3
4 0 0

1 2 0
4 0 0
*/

      相信例子中已经很明显了。

——总结自《c++编程金典》

原创粉丝点击