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输出之后为什么输出的是第一个字符串,知道‘\0’结束。

接着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

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

posted @ 2020-09-05 16:01  wangheq  阅读(381)  评论(0编辑  收藏  举报