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 }
运行这里代码:
Value of names[0] = Zara Ali Value of names[1] = Hina Ali Value of names[2] = Nuha Ali Value of names[3] = Sara Ali
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 }
运行结果如下所示:
Value of names[0] = 0x7fff8340d9c0 Value of names[1] = 0x7fff8340d9c8 Value of names[2] = 0x7fff8340d9d0 Value of names[3] = 0x7fff8340d9d8
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 }
运行结果如下所示:
Value of names[0] = Z Value of names[1] = H Value of names[2] = N Value of names[3] = S
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 }
运行结果如下:
Value of names[0] = a Value of names[1] = i Value of names[2] = u Value of names[3] = a
分析:我们来讨论这里的四个地方的区别。
首先我们要知道数组与指针的关系。数组名是指向数组中第一个元素的常量指针。比如定义一个数组
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 }
运行结果如下:
Value of names[0] = Hina Ali Value of names[1] = Nuha Ali Value of names[2] = Sara Ali Value of names[3] =
但是将这行注释//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 }
运行结果如下:
Value of names[0] = Hina Ali Value of names[1] = Nuha Ali Value of names[2] = Sara Ali Value of names[3] = wang
考虑这个示例的输入为啥这样子?