[英]Ways to declare in C++ a 2D Array of pointers
我在努力理解下面的代码,我理解t是多维字符变量(3行3列),p是指针或指针数组,不应将指针数组声明为:
int **p[3][3];
p= new int*[3]
而不是*p = (char *)t;
有人可以帮助我理解此声明的含义吗?
#include <iostream>
using namespace std;
int main() {
char t[3][3], *p = (char *)t;
for(int i = 0; i < 9; i++)
*p++ = 'a' + i;
cout << t[1][1];
return 0;
}
char t [3] [3]在内存中分配9个字符,类似于:
1 2 3 4 5 6 7 8 9
[ ][ ][ ][ ][ ][ ][ ][ ][ ]
接下来,让指针p指向第一个分配的char(* p =(char *)t
1 2 3 4 5 6 7 8 9
[ ][ ][ ][ ][ ][ ][ ][ ][ ]
*p
知道有9个分配的字符,您现在可以使用* p ++语句将指针向前移动,因此在第一个* p ++之后
1 2 3 4 5 6 7 8 9
[ ][ ][ ][ ][ ][ ][ ][ ][ ]
*p
然后将char'a'+ i插入该内存位置
1 2 3 4 5 6 7 8 9
[ ][a][ ][ ][ ][ ][ ][ ][ ]
*p
1 2 3 4 5 6 7 8 9
[ ][a][b][ ][ ][ ][ ][ ][ ]
*p
等等...
请注意,运算符的优先级很重要,++(后缀)的优先级比*(小数点)高,因此,如果您愿意的话,首先将指针加1(++),然后再使用inderection即可对分配的内存进行“访问”更明确地说,您可以使用*(p ++)代替。
发生的是它声明变量p与2D数组t具有相同的指针。 这样,它可以访问它而无需嵌套的forloops。
“以图形方式”访问内容的方式如下:
有问题的指针。
T
->1 2 3
4 5 6
7 8 9
P
->1 2 3 4 5 6 7 8 9
如果你有这样的数组
char t[3][3];
然后可以将指向其第一个元素的指针声明为
char ( *p )[3] = t;
那就是指针p
指向char[3]
类型的对象。 如果增加指针++p
然后在值p
将增加等于值sizeof( char[3] )
是p
将指向该阵列的第二个“行”。
此声明后存储在p
的值
char ( *p )[3] = t;
等于表达式&t[0][0]
。 区别在于这些指针指向的对象的类型。
这样你可以写例如
char *p2 = reinterpret_cast<char *>( p );
因此p2
和p
具有相同的值,但是增加指针p2
将其“右”移动以指向数组的第二个字符,而增加指针p
将其“右”移动一次指向数组的第二个“行” 。
因此,您可以将指针p
重新解释为chsr *
类型的指针,以逐字符遍历数组。
您可以使用C强制转换
char *p2 = (char *)t;
或使用C ++强制转换
char *p2 = reinterpret_cast<char *>( t );
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.