取消引用双指针
Dereferencing double pointer
我不明白为什么最后一段代码打印的是 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 成为指向一个或多个数组的指针,但我想发生的事情是我将 **b 变成了一个指向指针的指针数组。
下面的答案是代码以一种方式工作的很好的解决方案,这里是如何使代码按我最初的预期工作的解决方案:
Pointer to Array of Pointers
此程序应产生多个编译器警告。修复它们对解决问题和消除任何误解大有帮助。
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;
从严格的打字角度来看,行:
*(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*
的指针上完成的,而不是指向 [= 的指针24=].
行中
printf("%d\n",b[0][0]);
printf("%d\n",**(b+0) );
您正在将 int*
传递给函数,而格式说明符需要 int
。其余 printf
个语句存在同样的问题。
如果您使用 gcc
,请使用编译器标志 -Wall
来检测此类问题。
您可以使用
解决您的问题
int *b[3];
我不明白为什么最后一段代码打印的是 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 成为指向一个或多个数组的指针,但我想发生的事情是我将 **b 变成了一个指向指针的指针数组。
下面的答案是代码以一种方式工作的很好的解决方案,这里是如何使代码按我最初的预期工作的解决方案:
Pointer to Array of Pointers
此程序应产生多个编译器警告。修复它们对解决问题和消除任何误解大有帮助。
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;
从严格的打字角度来看,行:
*(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*
的指针上完成的,而不是指向 [= 的指针24=].
行中
printf("%d\n",b[0][0]);
printf("%d\n",**(b+0) );
您正在将 int*
传递给函数,而格式说明符需要 int
。其余 printf
个语句存在同样的问题。
如果您使用 gcc
,请使用编译器标志 -Wall
来检测此类问题。
您可以使用
解决您的问题int *b[3];