设置指向堆栈内存块的指针?
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
我想创建一个指向堆栈内存块的指针。我不想复制内容,只是有一个指向它的指针。我该怎么做?
这是我试过的...
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