指针与多维字符串数组

利用指针访问多维字符串数组的问题,是一个有趣且重要的知识点,其实并不复杂只需要对指向指针的指针进行拆解分析即可,下面进入正文

首先我们定义一个多维字符串数组,然后利用4种方式进行输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
int main() {
char t[][3][5] = {"abcd","efgh","ijkl","mnop","qrst","uvwx"};
cout<<t[1][2][2]<<" "
<<*(t[1][2]+2)<<" "
<<*(*(t[1]+2)+2)<<" "
<<(*(*(t+1)+2)+2)<<endl;
return 0;
}

/*
输出结果
w w w wx
*/

首先字符串数组会自动被分成三维数组 也可以简单想成两行三列的数组,只是每个元素都是一个字符串也就是字符型数组。接下来我们可以看到第4种的输出与其他的不同,接下来我们进行分析

首先我们要明确 数组名 是数组第一个元素的地址 利用如下代码进行理解

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
using namespace std;
int main() {
int a[]={1,2,3,4,5,6};
cout<<a<<" "<<*a<<" "<<*(a+3)<<endl;
return 0;
}
/*
输出结果
0x7ffee2d57830 1 4
*/

对四个输出分别进行分析

  1. 最基本的多维数组通过数组下标进行访问,访问的是第一维下标为1 第二维下标为2 第三维 字符串中下标为2的第三个字母’w’。

  2. 首先我们要知道t[1][2]中的内容为”uvwx”这个字符串,字符串也是一个数组,也就意味着t[1][2]是一个指向”uvwx”这个字符串首位的指针。t[1][2]+2意味着将这个指针向后移2位,指向’w’ 。*(t[1][2]+2)获取这个指针当中的内容便取出w。可以使用如下代码进行理解

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <iostream>
    using namespace std;
    int main() {
    char t2[6]={'a','b','c','d','e','\0'};
    cout<<t2<<' '<<*t2<<' '<<*(t2+2)<<endl;
    return 0;
    }
    /*
    输出结果
    abcde a c
    */

  3. 首先t[1]同样作为一个数组是一个包含三个指向字符串的指针。而将t[1]理解为数组名,它指向的地址空间中存放着一个指向”mnop”字符串的指针,t[1]+2 将指针向后移2位即为指向”uvwx”字符串的指针。(t[1]+2)即为取得指向“uvwx”字符串的指针所指向地址空间中的内容,即为“uvwx”这个字符串。而 \(*(t[1]+2)+2)与第二个输出相类似,进行相同理解即可,所以输出w。

  4. 首先t可以近似理解成是一个存放着两个指针的数组,(t+1)与t[1]意思相同,中间部分理解与第三输出类似,故不再进行赘述。而重点在最后部分,\(*(t+1)+2)是”uvwx”这个字符串,而其中要关键要注意的便是(“uvwx”+2)与*(“uvwx”+2)的区别。未加星号的意味着仅将指针向后移两位,输出时会按照字符串进行输出到’\0’停止,而加星号则是获取指针后移2后那一位地址空间中的内容。可以利用如下代码进行理解。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <iostream>
    using namespace std;
    int main() {
    cout<<"abcde"+2<<endl;
    char t2[6]={'a','b','c','d','e','\0'};
    cout<<t2+2<<' '<<*(t2+2)<<endl;
    return 0;
    }
    /*
    输出结果
    cde
    cde c
    */

    以上均属于个人理解,如果有问题欢迎大家与我进行讨论。

打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信