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

时间:2017-03-10 15:42:55

标签: c++ arrays 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;
    }

3 个答案:

答案 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 );

因此p2p具有相同的值,但增加指针p2会使其“向右”移动以指向数组的第二个字符,同时增加指针{{1}将其“右”移动到一次指向数组的第二个“行”。

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

您可以使用C cast

编写
chsr *

或使用C ++强制转换

char *p2 = (char *)t;