繁体   English   中英

在C ++中声明2D指针数组的方法

[英]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 );

因此p2p具有相同的值,但是增加指针p2将其“右”移动以指向数组的第二个字符,而增加指针p将其“右”移动一次指向数组的第二个“行” 。

因此,您可以将指针p重新解释为chsr *类型的指针,以逐字符遍历数组。

您可以使用C强制转换

char *p2 = (char *)t;

或使用C ++强制转换

char *p2 = reinterpret_cast<char *>( t );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM