1.基本方式构造的二维数组(提前分配内存)
传参方式:
方法一, 形参给出第二维的长度。
#include <stdio.h>
void func(int n, char str[ ][5] )
{
int i;
for(i = 0; i < n; i++)
printf("/nstr[%d] = %s/n", i, str[i]);
}
void main()
{
char* p[3];
char str[][5] = {"abc","def","ghi"};
func(3, str);
}
方法二,形参声明为指向数组的指针。(推荐)
#include <stdio.h>
void func(int n, char (*str)[5] ){
int i;
for(i = 0; i < n; i++)
printf("/nstr[%d] = %s/n", i, str[i]);
}
void main()
{
char* p[3];
char str[][5] = {"abc","def","ghi"};
func(3, str);
}
用基本的方法构造二维数组,需要提前确定其大小。虽然有动态分配的方式,但是可能会有分配不连续的问题,因此如果要动态分配的话还是用vector。
2.采用vector构造二维数组
使用方式:
//用vector来代替数组
#include<iostream>
#include<vector>
using namespace std;
void main()
{
vector<vector<int> >array(3);//二维数组包含3个向量
for(int i = 0; i <3; i++)
array[i].resize(3);//设置数组的大小3X3
//现在你可以和使用数组一样使用这个vector
for (int i = 0; i <3; i++)
for (int j = 0; j <3; j++)
array[i][j] = (i*j);
//输出
for (int i = 0; i <3; i++)
{
for (int j = 0; j <3; j++)
cout<<array[i][j] << " ";
cout<<endl;
}
cout << "------------" << endl;
array.resize(5);//二维数组包含5个向量
array[3].resize(3);//第4个向量包含3个元素
array[4].resize(3);//第5个向量包含3个元素
//现在是5X3的数组了
for (int i = 0; i <5; i++)
for (int j = 0; j <3; j++)
array[i][j] = (i*j);
for (int i = 0; i <5; i++)
{
for (int j = 0; j <3; j++)
cout <<array[i][j] << " ";
cout <<endl;
}
}
传参方式:
c++中常用的vector容器作为参数时,有三种传参方式,分别如下(为说明问题,用二维vector):
- function1(vector<vector<int> > vec),传值
- function2(vector<vector<int> > & vec),传引用
- function3(vector<vector<int> > * vec),传指针
注意,三种方式分别有对应的const形式,不在此讨论。
三种方式对应的调用形式分别为:
- function1(vec),传入值
- function2(vec),传入引用
- function3(&vec),传入地址
三种方式的效果分别为:
- 会发生拷贝构造
- 不会发生拷贝构造
- 不会发生拷贝构造