淘先锋技术网

首页 1 2 3 4 5 6 7

昨天做了百度的笔试题发现编程题的函数都这样:

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++二维数组名和二级指针点击打开链接

指针数组,数组指针与二维数组剖析点击打开链接