就从传统的说起,后边提了一点template。reference:http://www.cplusplus.com/doc/tutorial/arrays/
声明:
int arr [] 而非java习惯的int [] arr。
初始化:
arr = { }
arr = {1, 2, 3}。
或者声明时没有size,则自动分配,即 int arr1 [] = {1, 2, 3, 4, 5}//arr1 的size自动成了5.
或者声明时size大于初始化的,则多余的自动分配默认值(0).但是,如果没有初始化,只在声明时int arr [10],这时候是随机的。
多维数组:
C++是Row-Major的,which means先横着存再竖着存。
int jimmy [3][5]; // is equivalent to
int jimmy [15]; // (3 * 5 = 15)
做parameter时:
实质为传了地址,这就解释了为啥C++传array相当于pass by reference。
也解释了,如果传二维的,不能void pass(int arr [][]),应该是void pass(int arr [][3]).//This is necessary in order for the compiler to be able to determine the depth of each additional dimension.
Library的template:
C++03搞了一个模板出来,引用<array>,声明时不大一样,引用一样,可以整体复制,函数传递不decay为address,另外多了很多method。
之前没有arr.size(), 现在有了,就比如string.length().
例子:
#include <iostream>
#include <array>
using namespace std;
int main()
{
array<int,3> myarray {10,20,30};
for (int i=0; i<myarray.size(); ++i)
++myarray[i];
for (int elem : myarray)
cout << elem << '\n';
}
New:这叫Dynamic memory
还可以用new 来声明数组,比如:
int * foo;
foo = new int [5];
foo指向的是首地址。
删除时:
delete pointer;delete[] pointer;
前者删pointer,后者删了整个new出来的memory chunk。
下面是解决办法。Reference: http://stackoverflow.com/questions/8767166/passing-2d-array-to-function
There are three ways to pass a 2D array to a function:
1, The parameter is a 2D array
int array[10][10];
void passFunc(int a[][10])
{
// ...
}
passFunc(array);
2, The parameter is an array containing pointers
int *array[10];
for(i = 0; i < 10; i++)
array[i] = new int[10];
void passFunc(int *a[10]) //array containing pointers
{
// ...
}
passFunc(array);
3, The parameter is a pointer to a pointer
int **array;
array = new int *[10];
for(i = 0; i <10; i++)
array[i] = new int[10];
void passFunc(int **a)
{
// ...
}
passFunc(array);