【问题标题】:Double Pointer manipulated操纵双指针
【发布时间】:2013-10-29 04:59:25
【问题描述】:

双指针操作。 建议解决方法。

#include <iostream>
#include <stdio.h>
using namespace std;
/* Pointer Passed as argument */
void func(void **p1)
{
     printf("Func %d\n",*p1);
}
/* main Function */
int main()
{ 
 void **p1 = NULL;
 int *p = (int *)malloc(sizeof(int));
 p[0] = 20;
 func((void**)&p);//pass by address
 //How can we assign double pointer i.e (*p1 = &p)
 printf("Main %d",*p);   // print value
 cin.get();
 return 0;   
}
//function end main.cpp
/*
Func " Garbage value "
Main 20
*/

我正在尝试使用双指针来检索数据。 有人可以调查一下,让我知道错误在哪里。

输出应该是 20 - 20 功能 20 主要 20

【问题讨论】:

  • 问题是什么?你期望什么,实际输出是什么?
  • 我希望这段代码能够工作
  • @PragRao 你得到了什么输出,你期待什么?
  • “双指针”在 C 或 C++ 中不是一个东西。你在这里玩的是一个“指向指针的指针”。
  • 此代码不是 C - 应删除标记,但仅此编辑太小而无法接受。

标签: c++ c pointers void-pointers


【解决方案1】:

这是你需要在func(void **p1)做的:

printf("Func %d\n",*((int *)*p1));

您必须再次取消引用它才能获得 int 值 - 因为它是一个指向指针的指针。

还有,do not cast the return of malloc(仅适用于 C)。在 C++ 中,强制转换是必需的(最好使用 new 运算符)。

在 main 你可以直接这样做:

  printf("Main %d",*((int *)*((  (void**)&p))));  

【讨论】:

  • 由于您标记了 C++ 和 C,因此有关 malloc 的信息仅适用于 C
  • 不鼓励在 C++ 中使用 malloc() (AFAIK)
  • @glglgl 再次感谢您提供的信息... OP 混合并混合了 C 和 C++... 在 C++ 中,我们还包括 cstdio :)
【解决方案2】:

函数中的printf应该是:

printf("Func %d\n", *((int*)*p1));

在函数中,p1 具有整数指针int * p 的地址。这意味着像*p1 一样取消引用它一次等同于原始指针p。因此,我们将其转换为 int * 并再次取消引用以获取值。

【讨论】:

  • 如何在 main 函数中做同样的事情。如果我想将双指针分配给单指针。不调用函数。
  • 你可以做 int ** p1 = &p.然后要获取该值,您可以像 *(*p1) 一样取消引用它两次。如果要使用 void **,则应为 void **p1=&p;和取消引用应该相同:*((int *)*p1)
  • @PragRao - printf("Main %d",*((int *)*(( (void**)&amp;p))));
  • void ** p1 = &p; // func((void**)&p); printf("主要 %d",p[0]); printf("函数 %d\n",* ((int*)*p1));这给出了从 int** 到 void** 的错误无效转换
  • 很抱歉错过了这个:void **p1 = (void **) &p; (我错过了演员)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-26
  • 1970-01-01
相关资源
最近更新 更多