本程序转载自:
https://www.cnblogs.com/xiaoxi666/p/6843211.html
为了理解方便,注释中加入了自己的理解。
直接上程序:
// changed by Wang Lei
// 2019-4-16 21:07:03
#include <iostream>
#include <vector>
using namespace std;
void function1(std::vector<std::vector<int> > vec)
{
cout << "-----------------------------------------" << endl;
//打印vec的地址
cout << "function1.&vec:" << &vec << endl;
//打印vec[i]的地址(即第一层vector的地址)
cout << "function1.&vec[i]:" << endl;
for (int i = 0; i < 2; i++)
cout << &vec[i] << endl;
//打印vec的各元素地址
cout << "function1.&vec[i][j]:" << endl;
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
cout << &vec[i][j] << " ";
cout << endl;
}
cout << "---------------------------" << endl;
//打印vec的各元素值
cout << "function1.vec[i][j]:" << endl;
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
cout << vec[i][j] << " ";
cout << endl;
}
}
//对于function2 中的引用传递& 在子函数中改变vec中某一位置的值,
//同样会引起主函数中 v 的对应位置的值变化。
void function2(std::vector<std::vector<int> >& vec)
{
cout << "-----------------------------------------" << endl;
//打印vec的地址
cout << "function2.&vec:" << &vec << endl;
//打印vec[i]的地址(即第一层vector的地址)
cout << "function2.&vec[i]:" << endl;
for (int i = 0; i < 2; i++)
cout << &vec[i] << endl;
//打印vec的各元素地址
cout << "function2.&vec[i][j]:" << endl;
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
cout << &vec[i][j] << " ";
cout << endl;
}
cout << "---------------------------" << endl;
//打印vec的各元素值
cout << "function2.vec[i][j]:" << endl;
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
cout << vec[i][j] << " ";
cout << endl;
}
}
void function3(std::vector<std::vector<int> > *vec)
{
cout << "-----------------------------------------" << endl;
//打印vec的地址
cout << "function3.&vec:" << vec << endl;
//打印vec[i]的地址(即第一层vector的地址)
cout << "function3.&vec[i]:" << endl;
for (int i = 0; i < 2; i++)
cout << &(*vec)[i] << endl; //这里肯定是先结合成 (*vec)[i] 再结合成&(*vec)[i]
//打印vec的各元素地址
cout << "function3.&vec[i][j]:" << endl;
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
cout << &(*vec)[i][j] << " ";
cout << endl;
}
cout << "---------------------------" << endl;
//打印vec的各元素值
cout << "function3.vec[i][j]:" << endl;
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
cout << (*vec)[i][j] << " "; //传递进来是个指针*。现在为了输出指针对应的数,用 *+指针 表示对应的值
cout << endl;
}
}
int main()
{
//vector<int>a, b(n, 0)
//vector<int>a的意思就是 创建了一个 int 类型的空的vector容器a。
//vector<int>b(n, 0) 创建了一个 int 类型n个元素,且值均为0的vecotr容器b。
//
//std::vector<std::vector<int> > v(2, std::vector<int>(3, 0));意思是创建了两个int型的元素,
//每一个均值都是 std::vector<int>(3, 0),即 [0,0,0]的vector
cout << "这是在主函数中" << endl;
//创建2*3的vector容器v,初始值均初始化为0 1 2 1 2 3
std::vector<std::vector<int> > v(2, std::vector<int>(3, 0));
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
v[i][j] = i + j; //赋值程序
}
//打印v的地址
cout << "&v:" << &v << endl; //这是求取地址的意思
//打印v[i]的地址(即第一层vector的地址)
cout << "&v[i]:" << endl;
for (int i = 0; i < 2; i++)
cout << &v[i] << endl;
//打印v的各元素地址
cout << "&v[i][j]:" << endl;
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
cout << &v[i][j] << " ";
cout << endl;
}
cout << "---------------------------" << endl;
//打印v的各元素值
cout << "v[i][j]:" << endl;
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
cout << v[i][j] << " ";
cout << endl;
}
function1(v);
function2(v);
function3(&v);
cout << "---------------------------" << endl;
//打印v的各元素值
cout << "v[i][j]:" << endl;
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
cout << v[i][j] << " ";
cout << endl;
}
cout << "输出c" << endl;
std::vector<int>& c = v[0];
c[1] = 10;
for (int i = 0; i < 3; i++)
cout << c[i] << " ";
cout << endl;
//改变c的值,v中对应位置处的值也变了
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
cout << v[i][j] << " ";
cout << endl;
}
system("pause");
return 0;
}