在堆上开辟二维数组,和在栈上开辟二维数组传递参数是可以不一样的,尤其对于字符串更是这样。
#include<iostream>
using namespace std;
void printf(char **b)
{
while(*b)//注意此处传入的b必须最后至少最后一组字符是'\0'否则会出错
cout<<*b++<<endl;
}
void print(char **b)
{
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
cout<<b[i][j]<<endl;
}
void print(char b[][10])//或者写成char (*b)[10],指向有10个char形的数组指针
{
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
cout<<b[i][j]<<endl;
}
void print(int **b)
{
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
cout<<b[i][j]<<endl;
}
void print(int b[][3])
{
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
cout<<b[i][j]<<endl;
}
int main()
{
char *b[6]={"aaa","bbbb","ccccc","dddddd","eeeeeee"};
char d[10][10]={"aaa","bbbb","ccccc","dddddd","eeeeeee"};
print(b);
printf(b);
print(d);//print(d)不能调用void print(char **b),因为d的第二个维度是固定的
int **a=new int*[3];
for(int i=0;i<3;i++)
a[i]=new int[i+3];
int k=1;
for(int i=0;i<3;i++)
for(int j=0;j<i+3;j++)
a[i][j]=k++;
int c[3][3]={{1,2,3},{4,5,6},{7,8,9}};
print(a);
print(c);//print(c)不能调用void print(int **b),因为c第二个维度是确定的
//以上两个例子说明了数组和指针用作首地址时候的不同点
system("pause");
return 0;
}
对于在堆上用new开辟的整型二维数组来说,用**传递参数意义不大,因为无法判断停止条件。但对于字符串来说是很有意义的,因为字符串默认最后会加入一个'\0'作为结束符,可以直接用**传递参数。