void *ptr;
int num = 13;
char c = 'q';
不使用struct,是否可以引用'num'和'c'然后从void指针中引用?
答案 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
保留num
或c
的内存地址和< / 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。
现在你已经看到了这种疯狂:
您曾多次提及i
。我想你在这里要做的事情是这样的:
memcpy
哪个是完全有效的(从存储memcpy(&num, &c, sizeof c);//sizeof c == 1, always
的内存中移出1个字节,然后将其复制到c
)。但这很愚蠢。 num
主要用于复制数组,数据结构或堆内存。 memcpy
是 int ,num
是c
。
char
是C 所以不是调用函数,而是通常让生活变得比以前复杂得多:
char
将 完全 您希望它做什么,它是最干净,最快速,最简单的解决方案,因此:它是最好的。
标准规定num = c;
(空指针)可以安全地转换为任何其他指针类型,然后再返回。这意味着可以将指向任何类型的指针分配给void指针,而不会出现问题。所以对于你的问题的答案是是:
void *
这两件事都是有效的。但是,标准 不 允许取消引用void指针。您必须强制转换到特定类型才能获得它指向的内存值:
ptr = &c;
ptr = #
反过来反过来明确声明类型为ptr = &c;
printf("%c\n", *(char *)ptr);
ptr = #
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] = #
(*((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
: - )