获取演示代码
#include <iostream>
#include <map>
#include <vector>
using namespace std;
typedef struct Student
{
public:
Student(){}
~Student(){}
static void print(int a,int b){printf("age is a\n");}
}Student;
int main(){
void (*p)(int, int) = &Student::print;
vector<void(*)(int,int)> tt;
tt.push_back(p);
tt[0](1,1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我想将 void(*)(int,int) 作为结构成员时,例如
struct void_func_st{
void(*)(int,int) f;
int a;
};
Run Code Online (Sandbox Code Playgroud)
代码错误。我不知道该结构是否可以实际制作,因为我不熟悉 void(*)(...) 的工作原理。或者我只是没有找到使 void(*)(...) 作为结构成员的正确方法。有人可以给一些建议吗?
为什么修改ptr对vector没有影响?我试图通过f函数改变值.
void f(int *ptr, int size, int value){
ptr=(int* )malloc(sizeof(int));
if(ptr!=NULL){
int i;
for(i=0;i<size;i++)
*(ptr + i) = value;
}
}
int main (void)
{
int *vector = NULL;
f(&vector, 3, 324);
printf("%p\n", vector);
}
Run Code Online (Sandbox Code Playgroud) 编译器(这里我正在考虑gcc,但我想它可能是任何C编译器)是否关心变量的来源?如果指针来自malloc,为什么它会有区别?它只是某些编译器使用的优化还是在C标准中提到的?
我正在初始化一个带有1个字节内存的void指针,并将其类型转换为int指针,并取消引用它,给它一个值3(需要4个字节),但运行正常.这不应该导致错误或导致像OOM这样的运行时异常吗?
void* record = malloc(1);
int i=3;
*((int*)record) = 3;
Run Code Online (Sandbox Code Playgroud) void *在C中使用有许多缺点(与内存相关,类型相关,效率明智......).尽管如此,我们还是使用它们来提供灵活性.
列出使用的缺点/缺点void *(以及C中的首选解决方案 - 如果可能的话).
编辑: 请通过以下链接:http: //attractivechaos.wordpress.com/2008/10/02/using-void-in-generic-c-programming-may-be-inefficient/
我有以下代码
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *A, B, C, D;
printf("Enter name A:");
scanf("%s", &A);
printf("Enter name B:");
scanf("%s", &B);
printf("Enter name C:");
scanf("%s", &C);
printf("Enter name D:");
scanf("%s", &D);
printf("%s, %s, %s, %s \n", A, B, C, D);
return 1;
}
Run Code Online (Sandbox Code Playgroud)
它接受四个字符串,但在打印出来之前会崩溃吗?
我想做的第二件事是将这些字符串(A,B,C,D)传递给接受void指针的函数,我是否必须先将它们转换为void指针?
我有一个复数的数组,我只想在两个元素之间交换.但是,我想实现未知类型的交换(使用void*).所以我使用我在这里看到的第一个交换实现编写了以下代码:
#include<stdio.h>
typedef struct complex complex;
struct complex {
int real;
int img;
};
void swap(void *arr[], int i, int j)
{
void *temp;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
void printComplexArray(complex* cArr, size_t len)
{
int i;
for (i = 0; i < len; i++)
{
printf("Cell %d : real- %d , img- %d\n", i, cArr[i].real, cArr[i].img);
}
}
void main(void)
{
complex cArr[] = { { 22, 3 },{ 1, 13 },{ …Run Code Online (Sandbox Code Playgroud) 我有一个库的返回值,它是一个void指针.我知道它指的是一个简短的int; 我尝试以下列方式获取int值(用简单的赋值替换函数调用a void *):
short n = 1;
void* s = &n;
int k = *(int*)s;
Run Code Online (Sandbox Code Playgroud)
我尝试转换一个指向一个地址的空指针,其中有一个短的,我试图将指针转换为指向一个int,当我这样做时,输出变成一个垃圾值.虽然我理解为什么它表现得像我不知道是否有解决方案.
我正在使用由其他人编码的C++代码.我想知道这行代码中发生了什么.
tplayer是一个数组,OnTickContext是一个bool变量.
tPlayers[i].OnTickContext = (void*)this;
Run Code Online (Sandbox Code Playgroud) 我正在调用一个通过指针参数返回变量的函数.我不关心这个参数的返回值,也不想让虚拟变量传递给函数.举一个简单的例子,假设函数如下,我不关心,也不想为参数"d"创建一个虚拟变量.
void foo(int a, int b, int* c, int* d)
{
*c = a+b;
*d = a+b+*c;
}
Run Code Online (Sandbox Code Playgroud)
据我所知,NULL指针理论上是一个指向不是任何对象或函数地址的位置的指针.如果将NULL定义如下,那么在此函数中将NULL传递给"d"是否正确?或者这是否会改变内存中第0个元素的内容?
#define NULL ((void *)0)
Run Code Online (Sandbox Code Playgroud)
目标设备是MSP430,我正在使用IAR C. 没有使用操作系统,因此没有实现内存管理
编辑:请注意,我不想创建虚拟变量.此外,如果有一种方法可以欺骗编译器在不改变函数定义的情况下优化"d"参数,这是更可取的.
编辑#2:我宁愿不在函数调用中使用&运算符,因为它会生成我不想生成的低效代码
编辑#3:对于那些在我谈论&运算符时不相信我的人......编译器手册指出"避免使用&运算符来获取局部变量的地址.这主要有两个原因:效率低.首先,变量必须放在内存中,因此不能放在处理器寄存器中.这会导致代码越来越大.其次,优化器不能再认为局部变量不受函数调用的影响."
什么错误的代码.应该是什么.因为它抛出一个错误.运算符'delete',应用于void*参数.
int i;
void *ptr = &i;
delete ptr;
Run Code Online (Sandbox Code Playgroud) 这是我的代码:
int main()
{
int *p;
void *x;
printf("%p\n", p);
printf("%p\n", x);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
将打印:
koraytugay $ ./a.out
0x7fff53b35ad0
0x0
koraytugay $ ./a.out
0x7fff5803fad0
0x0
koraytugay $ ./a.out
0x7fff512c9ad0
0x0
koraytugay $ ./a.out
0x7fff55213ad0
0x0
koraytugay $ ./a.out
0x7fff52dbdad0
0x0
这种行为在语言中有什么解释吗?
除了能够解除引用之外void**,我不理解以下内容:
void * foo, **bar;
foo++;//error
bar++;//no error
Run Code Online (Sandbox Code Playgroud)
为什么不是第一次工作而第二次工作呢?有什么不同?