希望得到" 无效 "一词来源的基础知识,以及为什么它被称为无效.这个问题的目的是帮助那些没有C经验的人,并突然看到一个基于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指针进行指针算术?
我对的含义感到困惑void *function()。
它是指向函数的指针还是返回的函数void*?我一直在数据结构上使用它作为返回指针的递归函数,但是当我在多线程(pthread)中看到代码时,会有一个相同的函数声明。现在我很困惑他们之间有什么区别。
当我打电话pthread_exit时main,程序永远不会终止.我期望程序完成,因为我退出程序的唯一线程,但它不起作用.好像挂了.
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
int main(int argc, char *argv[])
{
printf("-one-\n");
pthread_exit(NULL);
printf("-two-\n");
}
Run Code Online (Sandbox Code Playgroud)
Process Explorer显示(仅)线程处于Wait:DelayExecution状态.
根据pthread_exit文件:
在最后一个线程终止后,进程将以退出状态0退出.行为应该就像实现在线程终止时调用带有零参数的exit()一样.
我正在使用Dev-C++ v4.9.9.2和pthreads-win32 v2.8.0.0(链接libpthreadGC2.a).
该库似乎是确定(例如,呼叫pthread_self或pthread_create从main正常工作).
是否有什么我不应该调用任何理由pthread_exit从main?
我很困惑为什么我们需要传递void给C函数:
int f(void) { return 0; }
Run Code Online (Sandbox Code Playgroud)
与
int f() { return 0; }
Run Code Online (Sandbox Code Playgroud)
什么是正确的做法,为什么?
我从头开始学习C++,因此我对C语言没有专业的理解.在C++中,你不能把无效指针转换成什么,我理解背后的原因.但是,我知道在C中你可以.这有什么可能的原因?它似乎是类型安全的一个巨大漏洞,对我来说,这似乎是一件坏事.
char x = 'G';
char *p = &x;
printf ("Address of x: %p\n", p);
printf ("Address of x: %p\n", (void*)p);
Run Code Online (Sandbox Code Playgroud)
谁能告诉我究竟(void*)p意味着什么?我知道它是一样的p,因为它也给了我地址x,但为什么写的是(void*)p?
我知道你可以像这样声明一个没有任何参数的函数:
void test()
{
cout << "Hello world!!" << endl;
}
Run Code Online (Sandbox Code Playgroud)
但我也见过
void test(void)
{
cout << "Hello world!!" << endl;
}
Run Code Online (Sandbox Code Playgroud)
和
void test(void*)
{
cout << "Hello world!!" << endl;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是: usingvoid和void*here 有什么区别?
我正在学习动力学数据结构,例如malloc功能.为什么有时程序员使用void*指针参数(例如)整数和字符的动态变量?有什么区别?有什么好处?
我有一个返回数组的函数Data.数组的类型是int或float.我想用void指针.如果outputType为0,则Data指向整数数组的指针,如果不是,则指向浮点数组.
是否可以在C中执行此操作?
void getData(void *Data , uint8_t outputType)
{
...
int16_t acc[3]={0,0,0};
...
acc[0] = (int16_t) ((data[1]*256+data[0]));
acc[1] = (int16_t) ((data[3]*256+data[2]));
acc[2] = (int16_t) ((data[5]*256+data[4]));
Data = acc;
}
Run Code Online (Sandbox Code Playgroud)
在主要代码中:
int16_t output[3];
getData(output, 0);
Run Code Online (Sandbox Code Playgroud) 好吧,虽然堆栈上的详细信息void*,书籍喜欢The C Programming Language (K&R)和The C++ Programming Language (Stroustrup).我学到了什么?这void*是一个没有推断类型的通用指针.它需要强制转换为任何已定义的类型,并且打印void*只会产生地址.
还有什么我知道的? void*不能被解除引用,到目前为止仍然是C/C++我发现了很多关于但很少理解的一个项目.
我知道它必须是强制转换的,*(char*)void*但对我来说没有任何意义的generic指针是我必须知道我需要什么类型来获取值.我是一名Java程序员; 我理解泛型类型,但这是我挣扎的事情.
所以我写了一些代码
typedef struct node
{
void* data;
node* link;
}Node;
typedef struct list
{
Node* head;
}List;
Node* add_new(void* data, Node* link);
void show(Node* head);
Node* add_new(void* data, Node* link)
{
Node* newNode = new Node();
newNode->data = data;
newNode->link = link;
return newNode;
}
void show(Node* head)
{
while …Run Code Online (Sandbox Code Playgroud) 在下面的代码中,如何使指针p存储i的地址?printf()里面的"*(float*)p"是什么意思?
#include
void main()
{
int i = 10;
void *p = &i;
printf("%f\n", *(float *)p);
}
Run Code Online (Sandbox Code Playgroud)