将指针设置为堆栈内存块?

时间:2018-01-04 21:08:09

标签: c pointers visual-c++ stack visual-c++-2017

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

这就是我试过的......

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 个答案:

答案 0 :(得分: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} };

感谢M.M的改进。

答案 1 :(得分:0)

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

获取某些内存地址

指向pc的指针是

CHAR *ppc = &pc[0];

或简单地说:

CHAR *ppc = pc;

答案 2 :(得分: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]);

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

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  

答案 3 :(得分:-2)

指针不是数组,// order in UDF val largestPaymentDate = udf((lr: Seq[Row]) => { lr.max(Ordering.by((l: Row) => l.getAs[Double]("Paid"))).getAs[String]("Date") }) df.groupBy(col("Id")) .agg( collect_list(struct(col("Date"), col("Paid"))).as("UserPayments") ) .withColumn("LargestPaymentDate", largestPaymentDate(col("UserPayments"))) .show(false) +---+-------------------------------------------------+------------------+ |Id |UserPayments |LargestPaymentDate| +---+-------------------------------------------------+------------------+ |yc |[[07:00 AM,16.6], [09:00 AM,2.6]] |07:00 AM | |mk |[[10:00 AM,8.6], [06:00 AM,12.6], [11:00 AM,5.6]]|06:00 AM | +---+-------------------------------------------------+------------------+ 不保留索引它可能指向的任何数组的第二维所需的信息。

所以而不是char**你需要一个指向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数组的第二维完全匹配。