我正在努力理解下面的代码,我理解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;
}
答案 0 :(得分:1)
char t [3] [3]在内存中分配9个字符,如:
1 2 3 4 5 6 7 8 9
[ ][ ][ ][ ][ ][ ][ ][ ][ ]
接下来,让指针p指向第一个分配的字符(* 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&#39; a&#39; + i插入该内存位置
1 2 3 4 5 6 7 8 9
[ ][a][ ][ ][ ][ ][ ][ ][ ]
*p
1 2 3 4 5 6 7 8 9
[ ][a][b][ ][ ][ ][ ][ ][ ]
*p
依旧......
注意运算符优先级很重要,++(postfix)的优先级高于*(inderection),所以首先指针增加1(++),然后unrection给出&#39; access&#39;对于分配的内存,如果你更喜欢它,你可以改用*(p ++)。
答案 1 :(得分:0)
发生的事情是,它将变量p声明为与2D数组t具有相同的指针。这样它就可以访问它而不需要嵌套的forloops。
'以图形方式'将以如下方式访问内容:
指针有问题。
T
->1 2 3
4 5 6
7 8 9
P
->1 2 3 4 5 6 7 8 9
答案 2 :(得分:0)
如果您有这样的数组
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
会使其“向右”移动以指向数组的第二个字符,同时增加指针{{1}将其“右”移动到一次指向数组的第二个“行”。
因此,您可以将指针p
重新解释为类型p
的指针,以逐字符遍历数组。
您可以使用C cast
编写chsr *
或使用C ++强制转换
char *p2 = (char *)t;