标签: void-pointers

C不是那么难:void(*(*f [])())()

我今天刚看了一张照片,觉得我很感激解释.所以这是图片:

一些c代码

我发现这令人困惑,并想知道这些代码是否实用.我用Google搜索了这张照片,并在 reddit条目中找到了另一张照片,是照片:

一些有趣的解释

那么"螺旋式阅读"是有效的吗?这是C编译器解析的方式吗?
如果对这个奇怪的代码有更简单的解释,那就太好了.
除此之外,这些代码是否有用?如果是这样,何时何地?

一个关于"螺旋规则"的问题,但我不只是询问它是如何应用的,或者是如何用该规则读取表达式的.我也质疑这种表达方式的使用和螺旋规则的有效性.关于这些,已经发布了一些很好的答案.

c parsing pointers function-pointers void-pointers

184
推荐指数
10
解决办法
1万
查看次数

167
推荐指数
4
解决办法
7万
查看次数

C中空指针的指针算法

当一个指针到特定类型的(比如int,char,float,..)被递增,其值增加该数据类型的大小.如果void指向大小数据的指针x递增,它如何获得指向x前面的字节?编译器如何知道添加x指针的值?

c pointers void-pointers pointer-arithmetic

162
推荐指数
7
解决办法
11万
查看次数

C编程中无效指针的概念

是否可以在C编程语言中取消引用void指针而不使用类型转换?

另外,有没有任何方法可以概括一个可以接收指针并将其存储在void指针中的函数,并且通过使用该void指针,我们可以创建一个通用函数吗?

例如:

void abc(void *a, int b)
{
   if(b==1)
      printf("%d",*(int*)a);     // If integer pointer is received
   else if(b==2)
      printf("%c",*(char*)a);     // If character pointer is received
   else if(b==3)
      printf("%f",*(float*)a);     // If float pointer is received
}
Run Code Online (Sandbox Code Playgroud)

我想在不使用if-else语句的情况下使这个函数变得通用 - 这可能吗?

此外,如果有很好的互联网文章解释了无效指针的概念,那么如果你能提供这些URL会很有用.

是否可以使用void指针进行指针算术?

c void-pointers

127
推荐指数
5
解决办法
20万
查看次数

删除void指针是否安全?

假设我有以下代码:

void* my_alloc (size_t size)
{
   return new char [size];
}

void my_free (void* ptr)
{
   delete [] ptr;
}
Run Code Online (Sandbox Code Playgroud)

这样安全吗?或者必须在删除前ptr进行投射char*

c++ memory-management casting void-pointers

88
推荐指数
9
解决办法
5万
查看次数

什么是C++中的void指针?

可能重复:
什么是void指针,什么是空指针?

我经常看到类似于以下内容的代码:

void * foo(int bar);

这是什么意思?这是否意味着它可以返回任何东西?这是类似dynamicobject在C#?

c++ void-pointers

81
推荐指数
3
解决办法
10万
查看次数

错误:从'void*'转换为'int'会失去精度

我有一个原型函数,void* myFcn(void* arg)用作pthread的起点.我需要将参数转换为int以供以后使用:

int x = (int)arg;
Run Code Online (Sandbox Code Playgroud)

编译器(GCC版本4.2.4)返回错误:

file.cpp:233: error: cast from 'void*' to 'int' loses precision
Run Code Online (Sandbox Code Playgroud)

投这个的正确方法是什么?

c++ casting void-pointers

59
推荐指数
8
解决办法
13万
查看次数

C++ 中所有指针的大小都相同吗?

最近,我看到这样的说法

所有指针具有相同的大小是很常见的,但从技术上讲,指针类型具有不同的大小是可能的

但后来我发现了这样的内容:

虽然指针的大小都是相同的,因为它们只存储内存地址,但我们必须知道它们指向什么类型的东西。

现在,我不确定以上哪种说法是正确的。第二个引用的语句看起来像是来自佛罗里达州立大学计算机科学的 C++ 笔记。


这就是为什么在我看来所有指针都应该具有相同的大小:

1)假设我们有:

int i = 0;
void* ptr = &i; 
Run Code Online (Sandbox Code Playgroud)

现在,假设 C++ 标准允许指针具有不同的大小。进一步假设在某些任意机器/编译器上(因为标准允许),a 的void*大小为 2 字节,而 a 的int*大小为 4 字节。

现在,我认为这里有一个问题,即右侧有一个int*大小为 4 字节的 ,而左侧有一个void*大小为 2 字节的 。int*因此,当从到发生隐式转换时,void*将会丢失一些信息

2)所有指针都保存地址。由于对于给定的机器,所有地址都具有相同的大小,因此所有指针也应该具有相同的大小是非常自然(合乎逻辑的)。

因此,我认为第二句话是正确的。


我的第一个问题是 C++ 标准对此有何规定?

我的第二个问题是,如果 C++ 标准确实允许指针具有不同的大小,那么有理由吗?我的意思是允许指针具有不同的大小对我来说似乎有点不自然(考虑到我上面解释的两点)。所以,我很确定标准委员会一定已经考虑到了这一点(指针可以有不同的大小),并且已经有理由允许指针有不同的大小。请注意,只有当标准确实允许指针具有不同的大小时,我才会问这个(第二个问题)。

c++ pointers void-pointers language-lawyer pointer-conversion

56
推荐指数
5
解决办法
8669
查看次数

有没有办法避免隐式转换为 void*?

我正在使用void*在某些功能中接受的 API 。我经常不小心将错误的指针类型传递给函数,当然它编译得很好,但在运行时不起作用。

有没有办法禁用void*指向某个类的指针的隐式转换?

c++ void-pointers implicit-conversion

42
推荐指数
4
解决办法
2597
查看次数

什么是"typedef void(*Something)()"的意思

我试图理解这意味着什么,我正在看的代码

在.h

typedef void (*MCB)();
static MCB     m_process;
Run Code Online (Sandbox Code Playgroud)

在.C

MCB Modes::m_process = NULL;
Run Code Online (Sandbox Code Playgroud)

有时当我做的时候

m_process();
Run Code Online (Sandbox Code Playgroud)

我得到了分段错误,这可能是因为内存被释放了,我怎样才能在它被释放时进行调试?

我希望我的问题很清楚.

c++ typedef static-members void-pointers

39
推荐指数
4
解决办法
4万
查看次数