c语言中的void指针,C程序中void指针的概念

到目前为止,我对void指针的轻描淡写如下。

当使用关键字void声明指针变量时,它将成为通用指针变量。任何数据类型(char,int,float等)的任何变量的地址都可以分配给void指针变量。

main()

{

int *p;

void *vp;

vp=p;

}

由于可以将其他数据类型的指针分配给void指针,因此我在absolut_value(下面显示的代码)函数中使用了它。使具有一般功能

我试图编写一个简单的C代码,将整数或浮点数作为参数,并尝试使其为+ ve(如果为负)。我写了下面的代码,

#include

void absolute_value ( void *j) // works if used float, obviously it must work but thats not my interest here.

{

if ( *j < 0 )

*j = *j * (-1);

}

int main()

{

int i = 40;

float f = -40;

printf("print intiger i = %d \n",i);

printf("print float f = %f \n",f);

absolute_value(&i);

absolute_value(&f);

printf("print intiger i = %d \n",i);

printf("print float f = %f \n",f);

return 0;

}

但是我遇到了错误,所以我知道我对void指针的理解是不正确的:(。因此,我现在将着手收集点,为什么会这样。

我需要了解更多关于void指针的内容。

我们需要强制转换void指针变量以取消引用。这是因为空指针没有与之关联的数据类型。编译器无法知道(或猜测?)void指针指向的数据类型。因此,要获取由void指针指向的数据,我们使用在void指针位置内保存的正确类型的数据进行类型转换。

void main()

{

int a=10;

float b=35.75;

void *ptr; // Declaring a void pointer

ptr=&a; // Assigning address of integer to void pointer.

printf("The value of integer variable is= %d",*( (int*) ptr) );// (int*)ptr - is used for type casting. Where as *((int*)ptr) dereferences the typecasted void pointer variable.

ptr=&b; // Assigning address of float to void pointer.

printf("The value of float variable is= %f",*( (float*) ptr) );

}

如果程序员不确定最终用户输入的数据的数据类型,则空指针非常有用。在这种情况下,程序员可以使用void指针指向未知数据类型的位置。可以以要求用户通知数据类型的方式来设置程序,并且可以根据用户输入的信息来执行类型转换。下面是一个代码段。

void funct(void *a, int z)

{

if(z==1)

printf("%d",*(int*)a); // If user inputs 1, then he means the data is an integer and type casting is done accordingly.

else if(z==2)

printf("%c",*(char*)a); // Typecasting for character pointer.

else if(z==3)

printf("%f",*(float*)a); // Typecasting for float pointer

}

关于空指针,您应记住的另一个重要点是–不能在空指针中执行指针算术。

void *ptr;

int a;

ptr=&a;

ptr++; // This statement is invalid and will result in an error because 'ptr' is a void pointer variable.

所以现在我明白了我的错误。我正在更正。

参考文献:

http://www.antoarts.com/void-pointers-in-c/

http://www.circuitstoday.com/void-pointers-in-c。

新代码如下所示。

#include

#define INT 1

#define FLOAT 2

void absolute_value ( void *j, int *n)

{

if ( *n == INT) {

if ( *((int*)j) < 0 )

*((int*)j) = *((int*)j) * (-1);

}

if ( *n == FLOAT ) {

if ( *((float*)j) < 0 )

*((float*)j) = *((float*)j) * (-1);

}

}

int main()

{

int i = 0,n=0;

float f = 0;

printf("Press 1 to enter integer or 2 got float then enter the value to get absolute value\n");

scanf("%d",&n);

printf("\n");

if( n == 1) {

scanf("%d",&i);

printf("value entered before absolute function exec = %d \n",i);

absolute_value(&i,&n);

printf("value entered after absolute function exec = %d \n",i);

}

if( n == 2) {

scanf("%f",&f);

printf("value entered before absolute function exec = %f \n",f);

absolute_value(&f,&n);

printf("value entered after absolute function exec = %f \n",f);

}

else

printf("unknown entry try again\n");

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值