void指针小结

合集下载

C语言中void有什么作用

C语言中void有什么作用

C语言中void有什么作用void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。

那么C语言中void具体有什么作用呢?一起来学习下吧:1.概述许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误。

本文将对void关键字的深刻含义进行解说,并详述void及void指针类型的使用方法与技巧。

2.void的含义void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。

void几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void变量,让我们试着来定义:void a;这行语句编译时会出错,提示“illegal use of type 'void'”。

不过,即使void a的编译不会出错,它也没有任何实际意义。

void真正发挥的作用在于:(1) 对函数返回的限定;(2) 对函数参数的限定。

我们将在第三节对以上二点进行具体说明。

众所周知,如果指针p1和p2的类型相同,那么我们可以直接在p1和p2间互相赋值;如果p1和p2指向不同的数据类型,则必须使用强制类型转换运算符把赋值运算符右边的指针类型转换为左边指针的类型。

例如:float *p1;int *p2;p1 = p2;其中p1 = p2语句会编译出错,提示“'=' : cannot convert from 'int *' to 'float *'”,必须改为:p1 = (float *)p2;而void *则不同,任何类型的指针都可以直接赋值给它,无需进行强制类型转换:void *p1;int *p2;p1 = p2;但这并不意味着,void *也可以无需强制类型转换地赋给其它类型的指针。

因为“无类型”可以包容“有类型”,而“有类型”则不能包容“无类型”。

转载:C语言指针使用的注意事项

转载:C语言指针使用的注意事项

转载:C语⾔指针使⽤的注意事项相信⼤家对指针的⽤法已经很熟了,这⾥也不多说些定义性的东西了,只说⼀下指针使⽤中的注意事项吧。

⼀.在定义指针的时候注意连续声明多个指针时容易犯的错误,例如int * a,b;这种声明是声明了⼀个指向int类型变量的指针a和⼀个int型的变量b,这时候要清醒的记着,⽽不要混淆成是声明了两个int型指针。

⼆.要避免使⽤未初始化的指针。

很多运⾏时错误都是由未初始化的指针导致的,⽽且这种错误⼜不能被编译器检查所以很难被发现。

这时的解决办法就是尽量在使⽤指针的时候定义它,如果早定义的化⼀定要记得初始化,当然初始化时可以直接使⽤cstdlib中定义的NULL也可以直接赋值为0,这是很好的编程习惯。

三.指针赋值时⼀定要保证类型匹配,由于指针类型确定指针所指向对象的类型,因此初始化或赋值时必须保证类型匹配,这样才能在指针上执⾏相应的操作。

四.void * 类型的指针,其实这种形式只是记录了⼀个地址罢了,如上所说,由于不知道所指向的数据类型是什么所以不能进⾏相应的操作。

其实void * 指针仅仅⽀持⼏种有限的操作:1.与另外的指针进⾏⽐较,因为void *类型⾥⾯就是存的⼀个地址,所以这点很好理解;2.向函数传递void *指针或从函数返回void *指针,举个例⼦吧,我们平时常⽤的库函数qsort中的⽐较函数cmp(个⼈习惯于⽤这个名字)中传递的两个参数就是const void *类型的,⽤过的应该很熟了;3.给另⼀个void * 类型的指针赋值。

还是强调⼀下不能使⽤void * 指针操纵它所指向的对象。

五.不要将两个指针变量指向同⼀块动态内存。

这个容易引起很严重的问题。

如果将两个指针变量指向同⼀块动态内存,⽽其中⼀个⽣命期结束释放了该动态内存,这个时候就会出现问题,另⼀个指针所指向的地址虽然被释放了但该指针并不等于NULL,这就是所谓的悬垂指针错误,这种错误很难被察觉,⽽且⾮常严重,因为这时该指针的值是随机的,可能指向⼀个系统内存⽽导致程序崩溃。

void指针的转换(2)

void指针的转换(2)

void指针的转换(2)void类型指针能够通过显式转换为具有更⼩或同样存储对齐限制的指针。

但数据可能失真。

所谓“同样存储对齐限制”是指void类型指针所指的数据在内存中所占的长度与显式转换后的指针所指的数据在内存中所占的长度相等,⽐⽅以上程序中的p1所指的原数据在内存中占2个字节,p2所指的数据在内存中也是占两个数据。

但应注意的是。

仅仅有上⾯的这样的转换前后指针所指数据类型⼀致的转换才保持数据不失真,假设类型不⼀致,即使具有同样存储对齐限制,也有可能失真,⽐⽅由short转向unsigned short,请看下⾯程序:#include<stdio.h>int main(void){short a=-5,*p1=&a;unsigned short *p2;void *p3;p3=(void *)p1;p2=(unsigned short *)p3;printf("%d\n",*p2);return 0;}其输出结果就不再是-5了。

由于在指针转换时,short类型的数据也经过转换变成了unsigned short类型的数据,详细的转换过程请參考数据类型转换。

只是,也有数值不变的情况,如把a值变为5。

同理,假设是将void类型转换为具有更⼩存储对齐限制的指针时,也可能引起数值的改变。

请看下⾯程序:#include<stdio.h>int main(void){short a=720;char *p1;void *p2;p2=(void *)&a;p1=(char *)p2;printf("%d\n",*p1);return 0;}p1所指向的数据不再是720,⽽是-48。

由于a的值720在内存中的表⽰形式为D0 02(⼗六进制表⽰,共两块,即两个字节),当中D0的地址即a的地址:0x0012ff7c。

p2仅仅保存0x0012ff7c,不知道它占有两字节内存空间。

C++中的void类型

C++中的void类型

C++中的void类型Technorati 标签: ,1.1. void类型void类型其实是⼀种⽤于语法性的类型,⽽不是数据类型,主要⽤于作为函数的参数或返回值,或者定义void指针,表⽰⼀种未知类型。

1.1.1. 作为函数参数与返回值void func( void );void func( );例如上⾯两例,其实两种声明⽅式是等效的,在C++中如果参数列表为空,默认的参数类型即为void,但建议没有参数时使⽤void以提⾼程序的可读性。

因为C++在定义函数时不允许返回值类型为空,在C++98之前,是允许定义函数时不定义返回值的,默认的返回值是int类型。

其实默认int类型并不是好事,如果函数有返回值在函数返回时是需要消耗CPU传递返回值的,也或许也是C++98标准将默认返回值类型改为void的原因。

因为C++不允许默认返回值,所以当函数不需要返回值是,需要将返回值类型声明为int类型。

当调⽤返回值类型为void类型的函数时,在⼯程上有很多实际代码在前⾯加上(void)类型转换,以提⾼代码的可读性。

如调⽤上⾯定义的 func函数。

(void)func( );从另⼀个⾓度讲,这样严谨的⽅式是可以提⾼软件的健壮性的,调⽤函数时可以明确地看出是没有返回值的,如果调⽤⼀个返回值不是int类型的函数时最好判断其返回值,以检查函数调⽤是否成功,如:#includechar buff[5];func( );snprintf(buff, sizeof(buff), “%d”, “10240”);显然这段代码是有问题的,当然func没有返回值,这样调⽤是没有问题,但snprintf的调⽤会有问题因为缓冲区有可能太⼩⽽不能容纳结果字符串,上⾯的代码就有这个问题。

假设我们不知道snprintf有没有返回值,可能这个BUG我们不会发现,直到有⼀天出现了我们不期望的结果。

如果我们严格要求调⽤每个函数时必须判断函数的返回值,按照以下⾯的代码编码,就不会出给我们的程序造成隐患。

浅谈void及void指针

浅谈void及void指针

浅谈void及void指针在编程的过程中,大家都很熟悉void,但是对于void指针恐怕就没有那么熟悉吧,今天我在这里进行一些浅谈,希望对各位朋友有一定的帮助。

首先我们要知道数据类型,什么是数据类型,可以理解为一种数据的结构,每种数据类型都有相应的数据结构,既然是结构那么就有相应的结构信息,包括在内存中占有多少字节等等的东西。

内存是连续的,我们通常都说电脑的内存是2G,那么内存是在电脑出厂或者内存条出厂的时候就制定了每一个内存单元的标识的,内存是由内存单元组成的,一个内存单元我们通常是用一个字节来描述的,内存单元是由电荷位组成的,也就是说一个内存单元是由8个电位组成的,不要问我为什么是8个,我也不知道,呵呵。

好了,知道了内存单元,那么我们就能够知道数据类型的具体东西了,通常我们说一个int类型的变量占有4个字节,也就是说我们定义了一个变量那么它在内存里面是占有连续的4个字节。

好了,终于到了主题,那么void是什么数据类型呢,我的理解为未知的数据类型,这里的未知是指不知道在内存中占有多少字节,因此编译器在编译的过程中也就不能为其分配内存,所以我们就不能定义void类型的变量,那么void 指针又是怎么回事呢?首先明白,指针是存放对象地址(当对象占有多个字节的时候,存放的是第一个字节的地址)对象,而CPU就根据这个指针对象所存放的地址去进行一些操作,由于CPU是32位的,也就是我们通常说的32位机,那么CPU的寻址范围就是2的32次方,也就是4G的地址空间,而内存又只有2G,所以为了不浪费CPU的寻址能力,操作系统就提供了一种虚拟内存。

(扯远了)好了,CPU能够寻找2的32次方的地址空间,而一个字节只有8位,那么4个字节刚好能够把CPU所有的寻址空间都能够表述出来,因此所有的指针都是4个字节。

那么为什么我们平时还在定义不同数据类型的指针呢,可以直接定义一个数据指针就解决了我所有问题啊!你很聪明,不过设计C++语言的人比我们更聪明,如果我们都用一种数据类型来表示我们的地址,那么当一个int类型的变量的第一个字节的地址被保存到指针变量中的时候和一个char类型的变量的地址被保存到指针变量中的时候我们怎么知道是char类型的地址还是int类型的地址呢,因此指针变量包含了一个信息就是这个变量描述的地址应该是几个字节连续的,比如说我们定义了一个int类型的指针,那么指针变量知道这个地址是后面三个字节都是连续的,因此不能分开,是一个整体。

void指针的背后藏着什么?

void指针的背后藏着什么?

void指针的背后藏着什么?1. 不能动的“地址”之 void指针1.1 void指针初探void *表示一个“不知道类型”的指针,也就不知道从这个指针地址开始多少字节为一个数据。

和用int表示指针异曲同工,只是更明确是“指针”。

因此void *只能表示一个地址,不能用来&取值,也不能++和--移动指针,因此不知道多少字节是一个数据单位。

int nums[] = {3,5,6,7,9};void* ptr1 = nums;//int i = *ptr1; // 对于void指针没法直接取值int* ptr2 = (int*)nums;printf('%d,%d\n',ptr1,ptr2);int i = *ptr2;printf('%d\n',i);从输出结果可以看出,无论是无类型的void指针还是int类型指针,指向的地址都是一样的:PS:void *就是一个不能动的“地址”,在进行&、移动指针之前必须转型为类型指针。

1.2 void指针的用途这里我们看一下我们之前了解的memset函数,其第一个参数就是一个void指针,它可以帮我们屏蔽各种不同类型指针的差异。

如下面代码所示,我们既可以传入一个int类型数组的指针,也可以传入一个char类型数组的指针:int nums[20];memset(nums,0,sizeof(nums));char chs[2];memset(chs,0,sizeof(chs));那么,我们也可以试着自己动手模拟一下这个memset函数,暂且命名为mymemset吧:void mymemset(void *data,int num,int byteSize){// char就是一个字节,而计算机中是以字节为单位存储的char *ptr = (char*)data;int i;for(i=0;i<byteSize;i++){*ptr=num;ptr++;}}int main(int argc, char *argv[]){int nums[20];mymemset(nums,0,sizeof(nums));int i,len=sizeof(nums)/sizeof(int);for(i=0;i<len;i++){printf('%d ',nums[i]);}printf('\n');return 0;}在这个mymemset函数中,我们利用void指针接收不同类型的指针,利用char类型(一个字节)逐个字节读取内存中的每一个字节,最后依次填充指定的数字。

void指针的用法

void指针的用法

void指针的用法
Void指针是一种特殊类型的指针,它可以指向任何数据类
型的地址,包括基本数据类型、自定义类型和函数。

由于
void指针并不知道它所指向的数据的具体类型,所以在使用void指针前,必须将其转换为适当的类型。

在C语言中,使用void指针可以实现灵活的内存分配和动
态类型检查。

一种常见的用法是将void指针作为函数参数,
使函数能够处理不同类型的数据。

例如,可以使用void指针来实现通用的动态数组。

通过将
数据的地址存储在void指针中,可以在运行时根据需要分配
和释放内存。

当需要访问存储在动态数组中的数据时,可以通过将void指针转换为正确的指针类型来实现。

另一个常见的用法是在需要传递复杂数据结构的函数之间
传递指针。

使用void指针作为参数类型可以使函数具有更大
的灵活性,因为它可以接受任何类型的指针。

在函数中,可以将void指针转换为适当的指针类型,以便对数据进行操作。

需要注意的是,由于void指针的特殊性,使用时需要谨慎。

在转换void指针为其他类型指针之前,必须确保这个转换是
类型安全的。

否则,可能会导致内存错误或未定义的行为。

void指针在C语言中具有重要的用途,它可以用于实现灵
活的内存管理和处理不同类型的数据。

通过正确地使用和转换void指针,我们能够编写出更加通用和灵活的代码。

void指针传递参数

void指针传递参数

void指针传递参数
在C和C++中,void指针可以用来传递参数,以实现更加灵活和动态的数据处理。

使用void指针传递参数时,可以传递任意类型的数据,包括基本数据类型、结构体、数组等。

下面是一个使用void指针传递参数的示例:
c
#include<stdio.h>
void process(void* data) {
int* intData = (int*)data;
printf("Processing integer: %d\n",
*intData);
}
int main() {
int number = 42;
process(&number);
return0;
}
在上面的示例中,process函数接受一个void指针作为参数。

在函数内部,我们将void指针转换为指向整数的指针,并使用它来访问和打印整数值。

在主函数中,我们传递整数的地址给process函数,并调用该函数来处理整数。

需要注意的是,使用void指针传递参数时,我们需要显式地将void指针转换为正确的类型,以便正确地访问和操作数据。

同时,为了避免类型错误和内存访问问题,我们应该确保传入的参数是正确的类型,并且在处理数据时进行适当的类型转换和检查。

初学指针总结

初学指针总结

指针知识基础总结1.基础知识#include<stdio.h>int main(void){int *p;/*p是变量的名字,int*表示P变量存放的是int 类型变量的地址.如果定义为double *p;则p变量只能存放double类型变量的地址。

2、int* p,不表示定义了一个名字叫*p的变量。

应该理解为:p是变量名,p变量的数据类型是int*类型,所谓int*类型实际就是存放int变量地址的类型*/int i = 3;p = &i;/*1、p保存了i的地址,因此p指向i2、p不是i,i也不是p,更准确的说,修改p的值不影响i的值,修改i的值也不影响p的值。

3、指针变量就是存放地址的变量。

指针就是地址。

4、如果一个指针变量指向了某个普通变量,则*指针变量就完全等同于普通变量。

例子:如果p是个指针变量,并且p存放了普通变量i的地址,则p指向了普通变量i,*p 就完全等同于i。

或者说:在所有出现*p的地方都可以5、*p代表以p的内容为地址的变量。

*/j = *p;printf("i = %d\n, j = %d\n",i,j);return 0;}2、指针相减的问题/*2013年1月25日14:05:52*/#include<stdio.h>int main(){int a[5] = {1, 2 ,3 ,4 ,5};int *p = &a[0];int *q = &a[1];int i;//int *i;//errori = p-q;printf("%d\n",i);//i = 1,而不是等于4;printf("%d,%d\n",q,p);return 0;}/*1、对于指向数组的指针变量,可以加上或减去一个整数n。

设pa是指向数组a的指针变量,则pa+n,pa-n,pa++,++pa,pa--,--pa运算都是合法的。

拓展知识7-1 void指针

拓展知识7-1 void指针

拓展知识7-1 void指针指针变量的基类型可以是各种数值类型(short、int、long、float、double)、字符类型(char)、构造类型等,还可以是void类型。

1.void指针的定义定义格式:void *指针变量名;void为空类型,基类型为void的指针变量一般被称为通用指针或泛指针。

2.void指针的使用(1)任何指针值都可以赋值给void指针变量,即可以将任意类型变量的地址赋给void指针变量,使void指针指向该变量。

【示例1】 int a=9;void *p;p=&a;//使p指向a(2)由于void指针无法确定指向对象的类型,所以不能使用指针运算“*”间接引用指向的变量,要想间接引用指向的变量必须使用强制类型转换。

【示例2】 int a=9;void *p;p=&a;//使p指向aprintf("%d\n",*(int *)p);//*p引用错误,必须强制转换(3)将void指针值赋值给其他类型的指针时要进行强制转换。

【示例3】 int a=9;void *p;p=&a;q=(int *)p;//q=p错误,必须强制转换printf("%d\n",*q);(4)当进行纯粹的内存操作时,或者传递一个指向未定类型的指针时,可以使用void指针,void指针也常常用作函数指针。

在C语言中,许多库函数的参数或返回值的类型是void指针,比如内存拷贝函数memcpy,其原型为:void *memcpy(void *addrl,const void *addr2,unsigned int n),函数返回值的类型和前两个参数都是void指针,其功能是:将参数2指向单元的n个字节复制到参数1指向的单元。

在进行函数调用时可以将任意类型的指针传递给参数1和参数2。

【示例4】 int a=67890;short b=5;memcpy(&a,&b,sizeof(short));printf("%hd,%d\n",a,b);程序段将短整型变量b的sizeof(short)字节(即2个字节)的内容复制到int 型变量a的内存中,a按hd格式输出,输出结果为:5,5。

C和C++语言中的void及void指针总结

C和C++语言中的void及void指针总结

C/C++语言中的void及void指针总结一、void 和void* 含义void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。

对于void,如果定义void a;是会编译出错的(vc6下得到:error C2182: 'a' : illegal use of type 'void',vs08中:error C2182: “a”: 非法使用“void”类型)对于void*,任何类型的指针都可以直接赋值给它,无需进行强制类型转换。

1.void *p1;2.int *p2;3.p1 = p2;这样是正确的,不过不能将int*转换为void*二、我们在什么地方能用到void和void*1、对于void,发挥作用的有两个地方:一是对函数返回值的限定,二是对函数参数的限定。

下面举例说明:(林锐的《高质量c++编程指南》上有以下3个对void和void*的使用的类似示范,即,如没有参数,一定要写明void;如没有返回值,一定标注;如果函数参数可以为任意类型指针,声明函数参数为void*)1)对于返回值的限定1.#include "stdio.h"2.add ( int a, int b )3.{4.return a + b;5.}6.int main(int argc, char* argv[])7.{8. printf ( "2 + 3 = %d \n ", add ( 2, 3) );9.return 0;10.}上述程序,在C语言中运行是没有任何问题的,因为c语言中,函数如果没有返回值限定,则编译器默认返回为int来处理。

虽然看起来会以为返回void。

但是在c++中,类似代码:1.#include <iostream>ing namespace std;3.add ( int a, int b )4.{5.return a + b;6.}7.int main(int argc, char* argv[])8.{9. cout << "2 + 3 = "<< add ( 2, 3) << endl;10.return 0;11.}在vc6中编译依旧没有问题的,但是在vs08中测试,会得到错误:error C4430: 缺少类型说明符- 假定为int;在gcc下编译会出错:error: ISO C++ forbids declaration of 'add' with no type。

C语言中void

C语言中void

void的使用下面给出void关键字的使用规则:规则一如果函数没有返回值,那么应声明为void类型在C语言中,凡不加返回值类型限定的函数,就会被编译器作为返回整型值处理。

但是许多程序员却误以为其为void类型。

例如:add(int a,int b){return a+b;}int main(int argc,char*argv[]){printf("2+3=%d",add(2,3));}程序运行的结果为输出:2+3=5这说明不加返回值说明的函数的确为int函数。

林锐博士《高质量C/C++编程》中提到:“C++语言有很严格的类型安全检查,不允许上述情况(指函数不加类型声明)发生”。

可是编译器并不一定这么认定,譬如在Visual C++6.0中上述add函数的编译无错也无警告且运行正确,所以不能寄希望于编译器会做严格的类型检查。

因此,为了避免混乱,在编写C/C++程序时,对于任何函数都必须一个不漏地指定其类型。

如果函数没有返回值,一定要声明为void类型。

这既是程序良好可读性的需要,也是编程规范性的要求。

另外,加上void类型声明后,也可以发挥代码的“自注释”作用。

代码的“自注释”即代码能自己注释自己。

规则二如果函数无参数,那么应声明其参数为void。

在C++语言中声明一个这样的函数:int function(void){return1;}则进行下面的调用是不合法的:function(2);因为在C++中,函数参数为void的意思是这个函数不接受任何参数。

在Turbo C2.0中编译:#include"stdio.h"fun(){return1;}main(){printf("%d",fun(2));getchar();}编译正确且输出1,这说明,在C语言中,可以给无参数的函数传送任意类型的参数,但是在C++编译器中编译同样的代码则会出错。

在c语言中void的作用

在c语言中void的作用

在c语言中void的作用在C语言中,void是一个关键字,用来表示一个函数没有返回值或一个指针没有特定类型的指针。

void的作用主要有以下几个方面:1.函数返回值为空:void可以用来表示一个函数没有返回值。

在C语言中,函数可以返回各种类型的值,如整数、浮点数、字符等。

但是有些函数仅仅是用来执行一系列操作,而不需要返回任何值。

比如,当我们需要打印一些信息或执行一些操作时,可以将函数的返回类型声明为void。

例如:```void printMessageprintf("Hello, World!\n");```在上面的例子中,printMessage(函数不需要返回任何值,它仅仅打印一条消息。

使用void作为返回类型可以明确表明这一点。

2.函数参数为空:在C语言中,函数可以有参数,用来接收传递给函数的值。

有时候我们需要定义一个函数,不需要任何参数。

这时我们可以使用void来表示函数没有参数。

例如:```int getRandomNumber(void)return rand(;```在函数定义中,使用void关键字表示函数没有参数,即不接收任何值。

3.指针类型未知:void可以用来声明一个指针,而不指定具体的数据类型。

这在涉及多种数据类型的程序中非常有用。

例如,在编写通用内存分配函数时,可以使用void指针来分配内存,并将其转换为其他数据类型的指针。

例如:```void* allocateMemory(size_t size)void* memory = malloc(size);return memory;```在上面的例子中,allocateMemory(函数使用void指针来分配内存。

因为void指针没有特定的数据类型,可以将其转换为任何其他类型的指针。

4.泛型指针:void指针也可以用作泛型指针,以便在不同的数据类型之间进行转换。

在C语言中,没有内置的泛型类型,但可以使用void指针来模拟泛型。

函数指针void (fun)() 解析等

函数指针void (fun)() 解析等
//调用时如下:
fun(); // 或 (*fun)();
fp2(1); // 或 (*fun)(1);
void (*fun)(void *);定义一个指针,该指针指向函数的入口地址,参数为一个void指针类型
(void *)fun(void *);定义一个函数,返回值为指针的函数,参数为void指针类型
void指针
指针有两个属性:指向变量/对象的地址 和长度 ,但是指针只存储地址,长度则取决于指针的类型,编译器根据指针的类型从指针指向的地址向后寻址,指针类型不同则寻址范围也不同,比如:
表示 pf 是一个指向函数入口的指针变量,该函数的返回值 ( 函数值 ) 是整型。
下面通过例子来说明用指针形式实现对函数调用的方法。
int max(int a,int b){
if(a>b)return a;
else return b;
} main(ຫໍສະໝຸດ { int max(int a,int b);
怎样说明一个函数指针变量呢 ?
为了说明一个变量 fn_pointer 的类型是"返回值为 int 的函数指针", 你可以使用下面的说明语句:
int (*fn_pointer) ();
为了让编译器能正确地解释这句语句, *fn_pointer 必须用括号围起来。若漏了这对括号, 则:
int *fn_pointer ();
函数指针 (*(void (*)( ) )0)( ) 解析C++
概述
在很多情况下,尤其是读别人所写代码的时候,对 C语言声明的理解能力变得非常重要,而C语言本身的凝练简约也使得C语言的声明常常会令人感到非常困惑,因此,在这里我用一篇的内容来集中阐述一下这个问题。

c语言中void的作用

c语言中void的作用

c语言中void的作用c语言中,void的意思是“无类型”,相应的“void ”为无类型指针,常用在程序编写中对定义函数的参数类型、返回值函数中指针类型进行声明,其作用是对函数返回和参数的进行限定voidvoid最常见的用法,就是在函数中限定函数的参数和返回值的void draw(void):表明函数draw没有参数也没有返回值,void在别的的地方的应用我也没见过实际上,如果把void 和in,char,double类型放到一起理解的话,首先还是那向揭示本质的话,变量类型就是固定大小内存块的别名那么void占用多大内存呢,编译器并没有定义void占用多大内存,所以对于void var; 这样的定义,编译器自然是不允许的,在vs中的错误提示是: 不允许使用不完整的类型。

void相比于void.void *就更加有意义一些,void "是一个指针类型,指针变量都占4byte内存(4byte=32 bit=2^32=4G,所以4byte就足以指向任何的内存地址了),所以对于void p=NULL:这样的定义,编译器可以为p分配内存,那么,如此定义的O有什么作用呢? int *a=NULL p=a;double*b=NULL:p=b;char c[16]=(0);p=c;void*就像一张白纸,任何类型的指针都可以直接赋值给void*类型的指针;但是反过来int*a=NULL;a=p;//erra=(int*)p;//需要强制类型转换这样转过来转过去有何意义?典型应用void * memcpy(void *dest, const void *src, size t len).void * memsetQ ( void * buffer. int c. size t num ).memcpy和memset对外接收任何类型的指针,这样是合理并且必要的,因为这是内存操作函数,是对bit进行操作作的,考虑教据类型是没有任何意义的(越触及本质,越抽象,也越有包容性)。

深入理解void以及void指针的含义

深入理解void以及void指针的含义

深⼊理解void以及void指针的含义void即“⽆类型”,void *则为“⽆类型指针”,可以指向任何数据类型。

①void指针可以指向任意类型的数据,亦即可⽤任意数据类型的指针对void指针赋值。

例如:int *pint;void *pvoid;pvoid = pint; /* 不过不能 pint = pvoid; */如果要将pvoid赋给其他类型指针,则需要强制类型转换如:pint = (int *)pvoid;②在ANSI C标准中,不允许对void指针进⾏算术运算如pvoid++或pvoid+=1等,⽽在GNU中则允许,因为在缺省情况下,GNU认为void *与char *⼀样。

sizeof( *pvoid )== sizeof( char ).①对函数返回的限定。

②对函数参数的限定。

当函数不需要返回值时,必须使⽤void限定。

例如: void func(int, int);当函数不允许接受参数时,必须使⽤void限定。

例如: int func(void)。

由于void指针可以指向任意类型的数据,亦即可⽤任意数据类型的指针对void指针赋值,因此还可以⽤void指针来作为函数形参,这样函数就可以接受任意数据类型的指针作为参数。

例如:void * memcpy( void *dest, const void *src, size_t len );void * memset( void * buffer, int c, size_t num );许多初学者对C/C++语⾔中的void及void指针类型不甚理解,因此在使⽤上出现了⼀些错误。

本⽂将对void关键字的深刻含义进⾏解说,下⾯详述void及void指针类型的使⽤⽅法与技巧。

按照ANSI(AmericanNationalStandardsInstitute)标准,不能对void指针进⾏算法操作,即下列操作都是不合法的:void*pvoid;pvoid++;//ANSI:错误pvoid+=1;//ANSI:错误//ANSI标准之所以这样认定,是因为它坚持:进⾏算法操作的指针必须是确定知道其指向数据类型⼤⼩的。

void类型详解

void类型详解

void类型详解void的含义void即“⽆类型”,void *则为“⽆类型指针”,可以指向任何数据类型。

void指针使⽤规范①void指针可以指向任意类型的数据,亦即可⽤任意数据类型的指针对void指针赋值。

例如:int * pint;void *pvoid;pvoid = pint; /* 不过不能 pint= pvoid; */如果要将pvoid赋给其他类型指针,则需要强制类型转换如:pint= (int *)pvoid;②在ANSIC标准中,不允许对void指针进⾏算术运算如pvoid++或pvoid+=1等,⽽在GNU中则允许,因为在缺省情况下,GNU认为void *与char *⼀样。

sizeof(*pvoid )== sizeof( char).void的作⽤①对函数返回的限定。

②对函数参数的限定。

当函数不需要返回值时,必须使⽤void限定。

例如: void func(int, int);当函数不允许接受参数时,必须使⽤void限定。

例如: int func(void)。

由于void指针可以指向任意类型的数据,亦即可⽤任意数据类型的指针对void指针赋值,因此还可以⽤void指针来作为函数形参,这样函数就可以接受任意数据类型的指针作为参数。

例如:void * memcpy( void *dest, const void *src, size_t len );void * memset( void * buffer, int c, size_t num);------------------------------------------------------------------------------1. 综述许多初学者对C/C++语⾔中的void及void指针类型不甚理解,因此在使⽤上出现了⼀些错误。

本⽂将对void关键字的深刻含义进⾏解说,并详述void及void指针类型的使⽤⽅法与技巧。

c语言void的用法

c语言void的用法

c语言void的用法在C语言中,void是一个非常重要的关键字,它用于表示无返回值的函数或指针类型。

在本文中,我们将探讨void的用法及其在C 语言中的重要性。

我们来看一下void在函数中的用法。

在C语言中,函数可以有返回值,也可以没有返回值。

如果函数没有返回值,则应该使用void 关键字来声明函数。

例如,下面是一个没有返回值的函数的声明: ```void printHelloWorld();```在这个例子中,我们声明了一个名为printHelloWorld的函数,它没有任何参数,也没有返回值。

在函数体中,我们可以执行任何操作,但是不能使用return语句来返回任何值。

除了在函数中使用void关键字外,我们还可以使用它来声明指针类型。

在C语言中,指针是一种非常重要的数据类型,它可以用来存储内存地址。

当我们声明一个指针时,我们需要指定指针所指向的数据类型。

但是,有时候我们并不知道指针所指向的数据类型,或者我们不关心指针所指向的数据类型。

这时,我们可以使用void 指针。

下面是一个使用void指针的例子:```void *ptr;```在这个例子中,我们声明了一个名为ptr的指针,它指向任何类型的数据。

在使用void指针时,我们需要注意一些细节。

首先,我们不能对void指针进行算术运算,因为我们不知道它所指向的数据类型的大小。

其次,我们需要在使用void指针时进行类型转换,以便正确地访问所指向的数据。

我们来看一下void的重要性。

在C语言中,void关键字是非常重要的,因为它可以帮助我们编写更加灵活和通用的代码。

通过使用void指针,我们可以编写可以处理任何类型数据的函数。

这使得我们的代码更加通用和可重用。

此外,使用void关键字还可以帮助我们编写更加清晰和简洁的代码,因为它可以帮助我们避免使用过多的类型转换和重复的代码。

void是C语言中非常重要的关键字,它用于表示无返回值的函数或指针类型。

通过使用void关键字,我们可以编写更加灵活和通用的代码,使我们的代码更加清晰和简洁。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C/C++语言void及void指针深层探索
1.概述
许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误。

本文将对void关键字的深刻含义进行解说,并详述void及void指针类型的使用方法与技巧。

2.void的含义
void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。

void几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void变量,让我们试着来定义:
这行语句编译时会出错,提示“illegal use of type 'void'”。

不过,即使void a的编译不会出错,它也没有任何实际意义。

void真正发挥的作用在于:
(1)对函数返回的限定;
(2)对函数参数的限定。

我们将在第三节对以上二点进行具体说明。

众所周知,如果指针p1和p2的类型相同,那么我们可以直接在p1和p2间互相赋值;如果p1和p2指向不同的数据类型,则必须使用强制类型转换运算符把赋值运算符右边的指针类型转换为左边指针的类型。

例如:
其中p1 = p2语句会编译出错,提示“'=' : cannot convert from 'int *' to 'float *'”,必须改为:
而void *则不同,任何类型的指针都可以直接赋值给它,无需进行强制类型转换:
但这并不意味着,void *也可以无需强制类型转换地赋给其它类型的指针。

因为“无类型”可以包容“有类型”,而“有类型”则不能包容“无类型”。

道理很简单,我们可以说“男人和女人都是人”,但不能说“人是男人”或者“人是女人”。

下面的语句编译出错:
提示“'=' : cannot convert from 'void *' to 'int *'”。

3.void的使用
下面给出void关键字的使用规则:
规则一如果函数没有返回值,那么应声明为void类型
在C语言中,凡不加返回值类型限定的函数,就会被编译器作为返回整型值处理。

但是许多程序员却误以为其为void类型。

例如:
程序运行的结果为输出:
2 +
3 = 5
这说明不加返回值说明的函数的确为int函数。

林锐博士《高质量C/C++编程》中提到:“C++语言有很严格的类型安全检查,不允许上述情况(指函数不加类型声明)发生”。

可是编译器并不一定这么认定,譬如在Visual C++6.0中上述add函数的编译无错也无警告且运行正确,所以不能寄希望于编译器会做严格的类型检查。

因此,为了避免混乱,我们在编写C/C++程序时,对于任何函数都必须一个不漏地指定其类型。

如果函数没有返回值,一定要声明为void类型。

这既是程序良好可读性的需要,也是编程规范性的要求。

另外,加上void类型声明后,也可以发挥代码的“自注释”作用。

代码的“自注释”即代码能自己注释自己。

规则二如果函数无参数,那么应声明其参数为void
在C++语言中声明一个这样的函数:
则进行下面的调用是不合法的:
因为在C++中,函数参数为void的意思是这个函数不接受任何参数。

我们在Turbo C 2.0中编译:
编译正确且输出1,这说明,在C语言中,可以给无参数的函数传送任意类型的参数,但是在C++编译器中编译同样的代码则会出错。

在C++中,不能向无参数的函数传送任何参数,出错提示“'fun' : function does not take 1 parameters”。

所以,无论在C还是C++中,若函数不接受任何参数,一定要指明参数为void。

规则三小心使用void指针类型
按照ANSI(American National Standards Institute)标准,不能对void指针进行算法操作,即下列操作都是不合法的:
pint++的结果是使其增大sizeof(int)。

但是大名鼎鼎的GNU(GNU's Not Unix的缩写)则不这么认定,它指定void *的算法操作与char *一致。

因此下列语句在GNU编译器中皆正确:
pvoid++的执行结果是其增大了1。

在实际的程序设计中,为迎合ANSI标准,并提高程序的可移植性,我们可以这样编写实现同样功能的代码:
GNU和ANSI还有一些区别,总体而言,GNU较ANSI更“开放”,提供了对更多语法的支持。

但是我们在真实设计时,还是应该尽可能地迎合ANSI标准。

规则四如果函数的参数可以是任意类型指针,那么应声明其参数为void *
典型的如内存操作函数memcpy和memset的函数原型分别为:
这样,任何类型的指针都可以传入memcpy和memset中,这也真实地体现了内存操作函数的意义,因为它操作的对象仅仅是一片内存,而不论这片内存是什么类型。

如果memcpy和memset的参数类型不是void *,而是char *,那才叫真的奇怪了!这样的memcpy和memset明显不是一个“纯粹的,脱离低级趣味的”函数!
下面的代码执行正确:
有趣的是,memcpy和memset函数返回的也是void *类型,标准库函数的编写者是多么地富有学问啊!
规则五void不能代表一个真实的变量
下面代码都企图让void代表一个真实的变量,因此都是错误的代码:
void体现了一种抽象,这个世界上的变量都是“有类型”的,譬如一个人不是男人就是女人(还有人妖?)。

void的出现只是为了一种抽象的需要,如果你正确地理解了面向对象中“抽象基类”的概念,也很容易理解void数据类型。

正如不能给抽象基类定义一个实例,我们也不能定义一个void(让我们类比的称void为“抽象数据类型”)变量。

4.总结
小小的void蕴藏着很丰富的设计哲学,作为一名程序设计人员,对问题进行深一个层次的思考必然使我们受益匪浅。

相关文档
最新文档