Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
虚空*和虚空**的心理模型? 注:我是一个有经验的C++程序员,所以我不需要任何指针基础。只是我从来没有与void**一起工作过,我的心智模型很难适应void*与void**的对比。我希望有人能很好地解释这一点,这样我就能更容易地记住语义_C++_C_Void Pointers - Fatal编程技术网

虚空*和虚空**的心理模型? 注:我是一个有经验的C++程序员,所以我不需要任何指针基础。只是我从来没有与void**一起工作过,我的心智模型很难适应void*与void**的对比。我希望有人能很好地解释这一点,这样我就能更容易地记住语义

虚空*和虚空**的心理模型? 注:我是一个有经验的C++程序员,所以我不需要任何指针基础。只是我从来没有与void**一起工作过,我的心智模型很难适应void*与void**的对比。我希望有人能很好地解释这一点,这样我就能更容易地记住语义,c++,c,void-pointers,C++,C,Void Pointers,考虑以下代码:(使用VC++2005编译) void具有误导性,因为它听起来像null。但是,最好将void视为未指定的类型。因此,void*是未指定类型的指针,void**是未指定类型指针的指针。avoid*指向编译器未知类型的对象 void**指向存储此类void*void*的变量是指向某个对象的指针,但您不知道是什么。因为你不知道它是什么,你不知道它占用了多少空间,所以你不能增加指针 void**是指向void*的指针,因此它是指向指针的指针。我们知道指针占用了多少空间,所以我们可以增加v

考虑以下代码:(使用VC++2005编译)


void
具有误导性,因为它听起来像
null
。但是,最好将
void
视为未指定的类型。因此,
void*
是未指定类型的指针,
void**
是未指定类型指针的指针。

a
void*
指向编译器未知类型的对象


void**
指向存储此类
void*

void*
的变量是指向某个对象的指针,但您不知道是什么。因为你不知道它是什么,你不知道它占用了多少空间,所以你不能增加指针


void**
是指向
void*
的指针,因此它是指向指针的指针。我们知道指针占用了多少空间,所以我们可以增加
void**
指针以指向下一个指针。

A
void*
可以指向任何东西(函数除外)。所以它甚至可以指向指针,甚至可以指向其他
void*
对象


void**
是指向-
void*
的指针,因此它只能用于指向
void*
对象。

void
是一种没有对象的类型

void*
是一种传统的标量类型

void**
也是一种传统的标量类型,恰好指向
void*



void*
可以用来指向任何东西,但我更喜欢只将其用于未初始化的存储。通常有一种更好的方法来代替将
void*
指向实际对象。

在C语言中,
void*
通常是实现“泛型”函数的唯一实用方法。@Oli:是的,我想我不确定这里的语言上下文。这是一种奇怪的思维模式,“但是,最好将void看作一种未指定的类型。”在
void*
的上下文中有很好的解释,但是应该明确限定该上下文,因为这对于返回类型、参数列表等来说是完全错误的。void*是指向某个对象的指针,您通常确切知道该对象是什么(例如,由void*引用的int的链接列表),或者您不在乎(例如,memcpy从void*复制到void*)。这可能是迄今为止最好的解释之一。啊……简直太神奇了:)你的代码在GCC4.5.2中编译得很好,甚至是
另一个地址+1零件。你能添加你收到的错误信息吗?@Philip:我最近无意中发现一个帖子,说有一个GCC扩展,可以在void*上做算术运算。这就是GCC没有出现错误的原因。错误消息已在注释中:“void*”未知,请澄清。老兄,我讨厌那些GNU的人。。。
int main() {
  int obj = 42;
  void* ptr_to_obj = &obj;
  void* addr_of_ptr_to_obj = &ptr_to_obj;
  void** ptr_to_ptr_to_obj = &ptr_to_obj;
  void* another_addr = ptr_to_ptr_to_obj[0];
  // another_addr+1; // not allowed : 'void*' unknown size
  ptr_to_ptr_to_obj+1; // allowed
}