如何从void指针引用和取消引用不同的数据类型?

时间:2016-04-18 16:42:31

标签: c pointers void-pointers

void *ptr;
int num = 13;
char c = 'q';

不使用struct,是否可以引用'num'和'c'然后从void指针中引用?

3 个答案:

答案 0 :(得分:1)

不使用struct,是否可以引用' num'和' c'然后参考空指针?

是的,它是......

考虑一下

void *ptr;
int num = 13;
char c = 'q';

ptr = #
printf("%d ", *((int *)ptr);

ptr = &c;
printf("%c ", *((char *)ptr);

答案 1 :(得分:1)

更新

在您进行相当模糊的更新后,我认为您正在尝试询问是否可以ptr保留numc 的内存地址和< / em>更改存储在该内存中的值。答案是: ,但结果代码看起来很恶心:

#include <stdio.h>

int main ( void )
{
    char c = 'a';
    int i = 123;
    void *ptr;
    *(int *)(ptr = &i) += c;
    printf("%d\n", i);
    return 0;
}

让我们读一下“伏都教魔法”:*(int *)(ptr = &i) += c;

  • (ptr = &i):这是起点。如果int i变量为ptr,我正在分配地址。因为C中的赋值表达式求值为左成员的新值(ptr),所以此表达式解析为i的地址。
  • *(int *):我正在投射ptr,现已分配给int *,我取消引用它,有效地允许我写入{{1}的内存指向。
  • ptr:我将+= c;c是C中的整数类型的值)添加到内存中的值

最终结果是char现在设置为220。

现在你已经看到了这种疯狂:

不要这样做!

更新II

您曾多次提及i。我想你在这里要做的事情是这样的:

memcpy

哪个是完全有效的(从存储memcpy(&num, &c, sizeof c);//sizeof c == 1, always 的内存中移出1个字节,然后将其复制到c)。但这很愚蠢。 num主要用于复制数组,数据结构或堆内存。 memcpy int numc

char是C

中的整数类型

所以不是调用函数,而是通常让生活变得比以前复杂得多:

char

完全 您希望它做什么,它是最干净,最快速,最简单的解决方案,因此:它是最好的。

标准规定num = c; (空指针)可以安全地转换为任何其他指针类型,然后再返回。这意味着可以将指向任何类型的指针分配给void指针,而不会出现问题。所以对于你的问题的答案是

void *

这两件事都是有效的。但是,标准 允许取消引用void指针。您必须强制转换到特定类型才能获得它指向的内存值:

ptr = &c;
ptr = &num;

反过来反过来明确声明类型为ptr = &c; printf("%c\n", *(char *)ptr); ptr = &num; printf("%d\n", *(int *)ptr); 的变量,因为只有知道要将其转换为什么类型才能安全地使用它。这里值得注意的例外当然是函数参数......

库通常会允许/要求您将指针传递给回调函数。可以使用库来连接某种资源,一旦它完成了它,你就希望调用你的函数。想要在这种回调中访问状态并不常见,这可以通过将指针传递给内存块来轻松完成。 就库而言,该指针属于未知类型,因此库函数可能如下所示:

void *

然后通过这样做来调用的东西:

void some_external_lib_function(int (*callback)(int, void *), void *data);

答案 2 :(得分:-1)

  

不使用struct,是否可以引用&#39; num&#39;和&#39; c&#39;然后顺从空指针?

通过引入另一个变量可以完全实现:

int main(void)
{
  void * vpa[2];
  void * ptr = &vpa; /* &vpa evaluates to a void*(*)[2], 
                        a pointer to an array of two pointers to void.*/
  int num = 42;
  char c = '6';

  (*((void*(*)[2]) ptr))[0] = &num;
  (*((void*(*)[2]) ptr))[1] = &c;

  printf("num = %d, c = %c\n", 
     *((int*) ((*((void*(*)[2]) ptr))[0])), 
    *((char*) ((*((void*(*)[2]) ptr))[1]))
  );
}

结果:

num = 42, c = 6

: - )