0

我想创建一个指向堆栈内存块的指针。我不想复制内容,只是有一个指向它的指针。我该怎么做?

这是我试过的...

char p[3][2] = { 1,2,3,4,5,6 };
printf("\nLIST:%d,%d,%d,%d,%d,%d\n", p[0][0], p[1][0], p[2][0], p[0][1], p[1][1], p[2][1]); //works fine 

char pc[3][2] = { 1,2,3,4,5,6 };
char **p = (char**)pc;//No error here... but shows on next line when accessing through the pointer
printf("\nLIST:%d,%d,%d,%d,%d,%d\n", p[0][0], p[1][0], p[2][0], p[0][1], p[1][1], p[2][1]);  //ERROR:  an Exception thrown here... 
4

4 回答 4

1

您必须区分指针和数组。

char **p 意味着这p是一个指向指针的指针char。改为使用char *p

char *p = &pc;

这不会使您能够使用 p[x][y] 表示法。为此,我们可以这样做:

char (*p)[2] = pc;

当我尝试您的代码时,它可以工作。这是完整的主要内容:

int main()
{
    char pc[3][2] = { 1,2,3,4,5,6 };
    char (*p)[2] = pc;
    printf("\nLIST:%d,%d,%d,%d,%d,%d\n", p[0][0], p[1][0], p[2][0], p[0][1], p[1][1], p[2][1]);
}

它编译时没有警告(好吧,我没有引入任何以前不存在的警告)并输出:

$ ./a.out 

LIST:1,3,5,2,4,6

要删除警告,请更改

char pc[3][2] = { 1,2,3,4,5,6 };

char pc[3][2] = { {1,2},{3,4},{5,6} };

感谢MM的改进。

于 2018-01-04T21:11:55.730 回答
0

指针是存储某物的内存地址的变量。因此,您需要将 pc 的内存地址分配给指向 pc 的指针。你可以通过地址运算符 & 获得某物的内存地址。

指向 pc 的指针是

CHAR *ppc = &pc[0];

或者简单地说:

CHAR *ppc = pc;
于 2018-01-04T21:11:36.493 回答
0

这就是我所做的:(我不想在定义它时指定指针的大小。在重新定义时我会指定大小)

//assigning a pointer to a matrix
char pc[3][2] = { 1,2,3,4,5,6 };
char *pp;//this pointer(as a member) will be carried between classes.      
pp = &pc[0][0];//set pointer to the address of the first element:  via:  Igor Tandetnik

//redefining, validation and display
char p[2][3]; 
memcpy(p, pp, sizeof(char) * 6);
printf("\nLIST:%d,%d,%d,%d,%d,%d\n", p[0][0], p[1][0], p[2][0], p[0][1], p[1][1], p[2][1]);

有趣的是,对于一维数组,您将指针设置为数组名称(地址)而不是第一个元素的地址。

char pc[6] = { 1,2,3,4,5,6 };
char *pp;
pp = pc;//set pointer to the address of the 'pc', not the first element  
于 2018-01-05T14:23:24.310 回答
-2

指针不是数组,并且 achar**不保留索引它可能指向的任何数组的第二维所需的信息。

因此,char**您不需要指向char[2]数组的指针,因为否则第二维的大小pc是未知的p,因此p[n]无法确定。

你可以通过声明一个指向数组的指针来解决这个问题,如下所示:

char pc[3][2] = { 1,2,3,4,5,6 }; 
char (*p)[2] = pc;
printf("\nLIST:%d,%d,%d,%d,%d,%d\n", p[0][0], 
                                     p[1][0], 
                                     p[2][0], 
                                     p[0][1], 
                                     p[1][1], 
                                     p[2][1] ) ;

为了产生正确的结果,p指针的维度必须与二维数组pc数组的第二维度完全匹配。

于 2018-01-04T21:41:27.770 回答