• C++指针数组和数组指针


    首先来看一个例子:

     1 #include <iostream>
     2  
     3 using namespace std;
     4 const int MAX = 4;
     5  
     6 int main ()
     7 {
     8  const char *names[MAX] = {
     9                    "Zara Ali",
    10                    "Hina Ali",
    11                    "Nuha Ali",
    12                    "Sara Ali",
    13    };
    14  
    15    for (int i = 0; i < MAX; i++)
    16    {
    17       cout << "Value of names[" << i << "] = ";
    18       cout << names[i] << endl;//这里使我们讨论的重点
    19    }
    20    return 0;
    21 }

    1、cout << names[i] << endl

    这是一个指向字符的指针数组来存储的一个字符串列表。当使用cout << names[i] << endl的时候,这里输出的是对应这个数组的第i+1的字符串。此时这里输出的是完整的字符串。代码如下所示

     1 #include <iostream>
     2  
     3 using namespace std;
     4 const int MAX = 4;
     5  
     6 int main ()
     7 {
     8  const char *names[MAX] = {
     9                    "Zara Ali",
    10                    "Hina Ali",
    11                    "Nuha Ali",
    12                    "Sara Ali",
    13    };
    14  
    15    for (int i = 0; i < MAX; i++)
    16    {
    17       cout << "Value of names[" << i << "] = ";
    18       cout << names[i] << endl;
    19    }
    20    return 0;
    21 }
    View Code

    运行这里代码:

    Value of names[0] = Zara Ali
    Value of names[1] = Hina Ali
    Value of names[2] = Nuha Ali
    Value of names[3] = Sara Ali
    View Code

    2、cout << &names[i] << endl

    如果使用cout << &names[i] << endl的时候,这里输出的是地址。代码如下所示:

     1 #include <iostream>
     2 using namespace std;
     3 const int MAX = 4;
     4 int main()
     5 {
     6    const char *names[MAX] = {
     7                    "Zara Ali",
     8                    "Hina Ali",
     9                    "Nuha Ali",
    10                    "Sara Ali",
    11    };
    12  
    13    for (int i = 0; i < MAX; i++)
    14    {
    15       cout << "Value of names[" << i << "] = ";
    16       cout <<&names[i] << endl;
    17    }
    18    return 0;
    19 }
    View Code

    运行结果如下所示:

    Value of names[0] = 0x7fff8340d9c0
    Value of names[1] = 0x7fff8340d9c8
    Value of names[2] = 0x7fff8340d9d0
    Value of names[3] = 0x7fff8340d9d8
    View Code

    3、cout <<*names[i] << endl

    如果使用cout << *names[i] << endl的时候,这里输出的是数组里每个字符串的第一个字母。代码如下所示:

     1 #include <iostream>
     2 using namespace std;
     3 const int MAX = 4;
     4 int main()
     5 {
     6    const char *names[MAX] = {
     7                    "Zara Ali",
     8                    "Hina Ali",
     9                    "Nuha Ali",
    10                    "Sara Ali",
    11    };
    12  
    13    for (int i = 0; i < MAX; i++)
    14    {
    15       cout << "Value of names[" << i << "] = ";
    16       cout <<*names[i] << endl;
    17    }
    18    return 0;
    19 }
    View Code

    运行结果如下所示:

    Value of names[0] = Z
    Value of names[1] = H
    Value of names[2] = N
    Value of names[3] = S
    View Code

    4、cout <<*(names[i]+1) << endl

    如果使用cout << *(names[i] +1)<< endl的时候,这里输出的是数组里每个字符串的第二个字母。代码如下所示:

     1 #include <iostream>
     2 using namespace std;
     3 const int MAX = 4;
     4 int main()
     5 {
     6    const char *names[MAX] = {
     7                    "Zara Ali",
     8                    "Hina Ali",
     9                    "Nuha Ali",
    10                    "Sara Ali",
    11    };
    12  
    13    for (int i = 0; i < MAX; i++)
    14    {
    15       cout << "Value of names[" << i << "] = ";
    16       cout <<*(names[i]+1) << endl;
    17    }
    18    return 0;
    19 }
    View Code

    运行结果如下:

    Value of names[0] = a
    Value of names[1] = i
    Value of names[2] = u
    Value of names[3] = a
    View Code

    分析:我们来讨论这里的四个地方的区别。

    首先我们要知道数组与指针的关系。数组名是指向数组中第一个元素的常量指针。比如定义一个数组

    int array[10]

    array就是指向&array[0]的指针。这里注意一下&和* 两者的区别。&是取地址。*代表的是指针,取得是这个地址里的值。

    然后在介绍两个概念就了解了上面的区别:指针数组数组指针

    指针数组:指针的数组。首先它是一个数组,这个数组里面的所有元素都是指针类型。

    int *array[4]  //指针数组的形式

    数组指针:数组的指针。这个变量是一个指针,指针存放的是这个数组的首地址。

    int (*array)[4]   //数组指针的形式

    所以指针数组可以这么理解,定义一个指针数组之后,可以将这个指针型的数组理解为一个二维数组。此时array[0]代表的是第一个字符串的首地址。array[1]代表的是第二个字符串的首地址。以此类推。所以想快速理解的话可以将这个指针数组与二维数组搭配起来理解。然后这就解释了1、cout << names[i] << endl输出之后为什么输出的是第一个字符串,知道‘’结束。

    接着2、cout << &names[i] << endl。这里&是取地址。所以输出的是每一个字符串的首地址。

    然后3、cout <<*names[i] << endl。这里的*是取值。name[0]是代表第一个字符串的首地址,所以*names[i]就是取第一个字符串首地址的值也就是字符串的第一个字母。

    最后4、cout <<*(names[i]+1) << endl。首先()的优先级大于*。所以names[0]+1表示的是第一个字符串里的首地址的下一个地址。然后在使用*将这个地址里的值取出。所以这行代码所表示的是取出字符串里的第二个字母。也可以类比于二维数组。

    所以由上面四个例子就可以理解了指针数组的内容。

    数组指针是一个指针变量,它指向一个数组。来看下面一个图就理解了。

    补充示例:

    对上面的代码进行修改。代码如下:

     1 #include <iostream>
     2 using namespace std;
     3 const int MAX = 4;
     4 int main()
     5 {
     6    const char *names[MAX] = {
     7                    "Zara Ali",
     8                    "Hina Ali",
     9                    "Nuha Ali",
    10                    "Sara Ali",
    11    };
    12     //const char *str = "wang";
    13  
    14    for (int i = 0; i < MAX; i++)
    15    {
    16       cout << "Value of names[" << i << "] = ";
    17       cout <<names[i+1] << endl;
    18    }
    19    return 0;
    20 }
    View Code

    运行结果如下:

    Value of names[0] = Hina Ali
    Value of names[1] = Nuha Ali
    Value of names[2] = Sara Ali
    Value of names[3] = 
    View Code

    但是将这行注释//const char *str = "wang";去掉。代码如下:

     1 #include <iostream>
     2 using namespace std;
     3 const int MAX = 4;
     4 int main()
     5 {
     6    const char *names[MAX] = {
     7                    "Zara Ali",
     8                    "Hina Ali",
     9                    "Nuha Ali",
    10                    "Sara Ali",
    11    };
    12     const char *str = "wang";
    13  
    14    for (int i = 0; i < MAX; i++)
    15    {
    16       cout << "Value of names[" << i << "] = ";
    17       cout <<names[i+1] << endl;
    18    }
    19    return 0;
    20 }
    View Code

    运行结果如下:

    Value of names[0] = Hina Ali
    Value of names[1] = Nuha Ali
    Value of names[2] = Sara Ali
    Value of names[3] = wang
    View Code

    考虑这个示例的输入为啥这样子?

  • 相关阅读:
    向量求导几则公式备忘
    电脑硬件接触不良
    caffe编译新问题
    faster-rcnn 目标检测 数据集制作
    py-faster-rcnn 的makefile.config 注意事项
    ubuntu14.04 python + opencv 傻瓜式安装解决方案
    轻量级神经网络平台tiny-dnn实践
    OpenMP 并行编程
    React在Render中使用bind可能导致的问题
    为了cider,尝试emacs的坑
  • 原文地址:https://www.cnblogs.com/hequnwang/p/13618485.html
Copyright © 2020-2023  润新知