我不明白为什么最后一段代码打印的是 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("%dn",b[0][0]);
printf("%dn",**(b+0) );
//Prints 2000
printf("%dn", b[1][0] );
printf("%dn",**(b+1) );
//Prints 3000
printf("%dn", b[2][0] );
printf("%dn", **(b+2) );
//Should print 4000 i think, but prints 2000, why?
printf("%dn", b[2][1] );
printf("%dn", *(*(b+2)+1) );
编辑:我想要的是**b是指向一个或多个数组的指针,但我想发生的事情是我使**b成为指向指针的数组。
下面的答案是代码以一种方式工作的出色解决方案,以下是如何使代码按我最初预期工作的解决方案:
指向指针数组的指针
此程序应生成多个编译器警告。修复它们对于解决问题和消除任何误解大有帮助。
b
的类型是指针到指针到int
数组。这就是为什么下面的两个作业无效的原因:
*(b+0)= &val1;
*(b+1) = &val2;
将指针分配给int
到指针到指针到int
,这是不正确的。
通过打印指针来掩盖问题,就好像它是int
printf("%dn", 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;
演示。
从严格的键入角度来看,这些行:
*(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("%dn",b[0][0]);
printf("%dn",**(b+0) );
您正在向函数传递int*
,而格式说明符需要int
。其余的 printf
语句也存在相同的问题。
如果使用 gcc
,请使用编译器标志-Wall
来检测此类问题。
您可以使用
int *b[3];