1维数组创建的两种方法:
数组声明、赋值
声明一个数组
double myList[10];
声明多个数组
double myList[10], myList2[10];
声明数组时,中括号内的数组必须为常量。
myList[0] = 6;
当一个数组声明后还没有赋值,元素内容是任意的。
数组初始化语句
double myList[4] = {1.1, 1.2, 1.3, 1.4};
double myList[] = {1.1, 1.2, 1.3, 1.4};
中括号中的数字是可以省略的,因为编译器会自动计算大括号内的元素数目。
double myList[4] = {1.1};
上述语句相当于
double myList[] = {1.1, 0, 0, 0};
数组初始化语句相当于对数组先声明后赋值,如果大括号中的元素数目不足中括号中的数字,则使用元素0补齐。
1维数组作为函数参数
函数的定义如下所示:
void printArray(int list[], int arraySize) {
for (int i = 0; i < arraySize; i++) {
cout << list[i] << " ";
}
}
函数的调用如下所示:
int list[] = {1,2,3};
printArray(list, 3);
1、为了效率的考虑,数组作为函数参数进行传递,本质是传递了数组的首地址。是按引用方式传递的。
2、在传递1维数组时,在形参处可以不填写中括号中的数字。中扩号的意思是告诉编译器,传入的参数时一个数组的首地址,在函数体中可以使用下标访问其元素。
3、数组在内存中是连续存储的,所以在函数中,可以使用下标变量来访问相应的数组元素。
4、C++语法不会判断数组访问越界。但是在程序运行过程中,如果发生了数组越界,就会发生Runtime error。因此在传入数组的同时,要传入数组的大小。
1维数组作为函数返回值
C++不允许返回一个数组类型,诸如下面的语句:
int[] reverse(const int list[], int size);
但是由于C++传递数组时引用传递,因此可以在函数外部声明一个数组,通过函数改变其内部元素值。这样与返回一个数组时同样的效果。
void reverse(const int list[], int newList[], int size);
上面的语句将list传入函数reverse中,reverse将list反转后保存在newList中。
由于数组的传递时引用传递,因此,如果不希望数组的内容被函数改变,那么就需要在形参前加关键字const;如果希望数组时作为返回值的,那么就再形参前不加关键字const。
2维数组
2维数组的声明、赋值、初始化语句只需参看1维数组的进行扩展。
2维数组作为函数参数与1维数组略有不同。2维数组作为函数的参数传递时,第二个方括号内必须填写数字。例如:
<pre name="code" class="cpp">void Func(int array[3][10], int rowSize, int colSize){
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 10; j++) {
cout <<array[i][j] << " ";
}
}
}
void Func(int array[][10], int rowSize, int colSize) {
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 10; j++) {
cout <<array[i][j] << " ";
}
}
}
这是因为,二维数组在内存中的存储是连续的。在函数需要使用下标变量来对二维数组中的元素进行访问。编译器只有知道了第二维的大小,才能正确的寻址。寻址公式为:
array+i*colSize+j array是数组的首地址。
所以,在传入2维数组时,必须传入第二维的大小。
同理,在使用高维数组时,只可以省略第1个中括号内的数字,其余的中括号的内的数字必须填写。
引用: