我不明白为什么最后一段代码打印2000而不是4000.我猜有些初学者错误。你知道吗?使用DevC ++。
int val1 = 1000;
int val2 = 2000;
int val3[2] = {3000, 4000};
int **b[3];
*(b+0)= &val1;
*(b+1) = &val2;
*(b+2) = &val3;
//Prints 1000
//Prints what the first element of b is pointing at
printf("%d\n",b[0][0]);
printf("%d\n",**(b+0) );
//Prints 2000
printf("%d\n", b[1][0] );
printf("%d\n",**(b+1) );
//Prints 3000
printf("%d\n", b[2][0] );
printf("%d\n", **(b+2) );
//Should print 4000 i think, but prints 2000, why?
printf("%d\n", b[2][1] );
printf("%d\n", *(*(b+2)+1) );
编辑:我想要的是** b是指向数组或指针的指针,但我想发生的事情是我用**指针指向数组。
下面的答案是代码以一种方式工作的很好的解决方案,这里是一个解决方案,用于使代码按照我原定的目的运行:
答案 0 :(得分:2)
该程序应产生多个编译器警告。修复它们可以解决问题,并消除任何误解。
b
的类型是指向指针的数组 - int
。这就是为什么下面的两个作业无效:
*(b+0)= &val1;
*(b+1) = &val2;
您将指向int
的指针分配给指向指针 - int
的指针,这是不正确的。
通过打印指针来掩盖问题,就像它是int
:
printf("%d\n", b[0][0]);
b[0][0]
的类型是指向int
的指针,但您将其传递给%d
,int
将其解释为b[0][0]
。但是,int
的实际值为int **b[3];
...
*(b+2) = &val3;
,因此您可以看到预期值。
解决问题很简单:更改
int *b[3];
...
*(b+2) = val3;
到
Response.ContentType = "application/zip";
Response.AddHeader("content-disposition", "attachment;filename=" + response.FileName);
Response.BinaryWrite(response.Bytes);
Response.End();
答案 1 :(得分:0)
从严格的打字角度来看,行:
*(b+0)= &val1;
*(b+1) = &val2;
*(b+2) = &val3;
错了。
*(b+0)
的类型与b[0]
的类型相同,即int**
。
&val1
的类型为int*
。
*(b+1)
存在相同的类型不匹配。
&val3
的类型为int (*)[2]
。
*(b+2)+1
指向的内存与val3[1]
的地址不同,因为指针算术是在指向int*
的指针上完成的,而不是指向int
的指针}。
在行
printf("%d\n",b[0][0]);
printf("%d\n",**(b+0) );
您正在将int*
传递给函数,而格式说明符需要int
。其余printf
语句存在同样的问题。
如果您使用gcc
,请使用编译器标志-Wall
来检测这些类型的问题。
您可以使用
解决问题int *b[3];