【问题标题】:Dereferencing double pointer取消引用双指针
【发布时间】: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 变成了一个指向指针的数组。

下面的答案是代码以一种方式工作的很好的解决方案,这里是如何使代码按我最初的意图工作的解决方案:

Pointer to Array of Pointers

【问题讨论】:

  • 启用编译器中的所有警告,然后编译代码。不要忽视警告。
  • 编译器和调试器是你的朋友。打开所有警告... (-:
  • 启用编译器警告和迂腐标准一致性。不要向人类寻求机器可以免费提供的建议。
  • 像你这样混合类型是不好的,并且会导致坏事发生,当然通常是不可读的,很难理解正在发生的事情,并且除了你之外的任何人都无法维护那一刻。当你开始忘记它并理解你在做什么时,你认为你能够在几个月内重新回到这一点吗?
  • int **b[3]; --> int *b[3];, *(b+2) = &val3; --> *(b+2) = val3;

标签: c pointers dereference


【解决方案1】:

这个程序应该产生多个编译器警告。解决它们对解决问题和消除任何误解大有帮助。

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;

Demo.

【讨论】:

  • 谢谢!我之所以像以前那样编写代码是因为我想分配指针 b 指向的指针。我认为 b 会指向一个包含 3 个指针的数组,但我想我创建了一个包含 3 个指针的数组。我猜应该有一个简单的解决方案。
  • 是的,就在这里! :) stackoverflow.com/questions/6130712/…
【解决方案2】:

从严格的打字角度来看,这些行:

*(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]; 

【讨论】:

    猜你喜欢
    • 2012-01-04
    • 2020-03-17
    • 2021-12-30
    • 1970-01-01
    • 2014-11-03
    • 2013-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多