我想创建一个指向堆栈内存块的指针。我不想复制内容,只是指向它。我该怎么办?
这就是我试过的......
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...
答案 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
数组的第二维完全匹配。