设置指向堆栈内存块的指针?

Setting a Pointer to a block of stack memory?

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

这是我试过的...

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... 

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

获取某物的内存地址

指向pc的指针是

CHAR *ppc = &pc[0];

或简单地:

CHAR *ppc = pc;

你必须区分指针和数组。

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} };

感谢 M.M 的改进。

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

因此,您需要一个指向 char[2] 数组的指针而不是 char**,否则 p 不知道 pc 的第二个维度的大小,这样 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 数组的第二个维度完全匹配。

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

//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