昨天做了百度的笔试题发现编程题的函数都这样:
vector<int> fun(char **arr);
vector<int> fun(int **arr);
不久前阿里的也遇到了,不过没重视,这次百度的彻底暴露了自己这一短板,编程题那做的叫一个别扭,叫一个惨,所以这次就好好研究一下二级指针和二维数组的关系
一般二维字符串数组的使用:
char c[3][4]={"abc","def","ghi"};
cout<<c[0][1]<<c[1][1]<<endl;
这样输出的是be,同理,赋值和访问都能使用形如 c[i][j] 的方式访问。
这里为什么要定义每行4个字符?因为每个字符数组最后要添加一个‘\0’,如果不多添一个位置,会以下错误:
initializer-string for array of chars is too long
先看这段代码:
void fun(char *c){
cout<<c[1]<<endl;
}
int main(){
char c[3]="ab";
fun(c);
}
这是没毛病的,再加上以前很多教材都说数组名就是数组的地址,这样我们往往会联想到这种用法:
void f(char **c){
cout<<c[1][3]<<endl;
}
int main(){
char c[3][4]={"abc","def","ghi"};
f(c);
}
并且想当然的认为这也是对的(我也是,好好反省,哼哼),现在来看看报错:
error: cannot convert 'char (*)[4]' to 'char**' for argument '1' to 'void f(char**)'
不能将char(*)[4]这种类型转化成char**,char(*)[4]是指向长度为4的字符数组的指针。
既然不能转化,那我们强制类型转化怎么样?试试
将调用函数改成:f((char**)c);
发现不报错了,但是程序崩溃了,看来这种也不行。终于查到了这种方法:
void f(char **c){
cout<<c[1][2]<<endl;
}
int main(){
char *c[3]={"abc","def","ghi"};
f(c);
}
这是没问题的,*c[3] 表示这是一个一维数组,数组内的元素是char *类型,每个元素分别指向一个字符串。因为 [] 优先级大于 * 的优先级。
整形的情况类似。
笔试的时候真的傻,还在纠结怎么能这样用呢?其实直接用c[i][j]的方式使用就行了,醉了。
还有关于数组名到底是不是保存数组的地址,看了一下几个文章会有自己的认识,就不写了。
参考链接:
指针变量的含义点击打开链接
C/C++二维数组名和二级指针点击打开链接
指针数组,数组指针与二维数组剖析点击打开链接