【发布时间】:2016-05-16 13:05:35
【问题描述】:
我不明白为什么代码的最后一个 sn-p 打印 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 变成了一个指向指针的数组。
下面的答案是代码以一种方式工作的很好的解决方案,这里是如何使代码按我最初的意图工作的解决方案:
【问题讨论】:
-
启用编译器中的所有警告,然后编译代码。不要忽视警告。
-
编译器和调试器是你的朋友。打开所有警告... (-:
-
启用编译器警告和迂腐标准一致性。不要向人类寻求机器可以免费提供的建议。
-
像你这样混合类型是不好的,并且会导致坏事发生,当然通常是不可读的,很难理解正在发生的事情,并且除了你之外的任何人都无法维护那一刻。当你开始忘记它并理解你在做什么时,你认为你能够在几个月内重新回到这一点吗?
-
int **b[3];-->int *b[3];,*(b+2) = &val3;-->*(b+2) = val3;
标签: c pointers dereference