Linux c — void类型变量和指针
Linux c — void类型变量和指针1.什么是void?void在英文中形容词的意思就是无效的,空的,空虚的意思,在C语言中就是空类型的意思。在C语言中,使用void这个类型时,有如下规则:void 只能修饰函数,不能修饰变量void * 函数、变量都可以被修饰2.void的使用2.1 void修饰变量用void 定义一个a,编译后会报错void a;//void.c: 在函数‘mai
Linux c — void类型变量和指针
1.什么是void?
void在英文中形容词的意思就是无效的,空的,空虚的意思,在C语言中就是空类型的意思。
在C语言中,使用void这个类型时,有如下规则:
void 只能修饰函数,不能修饰变量
void * 函数、变量都可以被修饰
2.void的使用
2.1 void修饰变量
用void 定义一个a,编译后会报错
void a;
//void.c: 在函数‘main’中:
//void.c:5: 错误:变量或字段‘a’声明为 void
这说明void类型不能修饰一个变量,因为系统无法为a分配一段大小为空的内存
2.2 void修饰函数
void修饰函数,就是当函数返回值为空时,使用void类型变量修饰
例如我们经常使用的free()函数
void free(void *ptr);
free()函数包含在#include
2.3 void * 修饰变量
用void *修饰的变量,那么一定就是指针变量,这个指针变量可以接受任何指针类型的地址,并且也可以转换为任何类型的指针。
int a = 10;
double b = 20.22;
void *pa = &a;
void *pb = &b;
printf("%d\n", (*(int *)pa));
printf("%f\n", (*(double *)pb));
最终打印的结果是
10
20.220000
这说明,void*指针变量,这个指针变量占4个字节,就像是一个通用类型,就类似C++中的模板,但是我们不能直接对一个void*类型的指针进行解操作,我们连一个void类型的变量都无法定义,更不用说通过void*指针去访问这个void类型变量。
这种void*类型指针在C语言库函数中极为常见:
void *memset(void *s, int c, size_t n);
void free(void *ptr);
函数在进行参数传递时,通过void *类型接收任意类型地址,操作时在转换成所需类型指针进行解操作。
2.4 void *修饰函数
void 修饰函数,就是函数的返回值变量为void 类型,它与void*修饰变量含义相似,侧重点在于对指针的操作,返回值为void *,接收时转换为我们需要的类型,就可以解操作。
例如:
void *calloc(size_t nmemb, size_t size); //申请一段大小为size字节的空间,并且初始化为nmenb,返回这段空间的首地址
void *malloc(size_t size);//申请一段大小为size字节的空间,返回这段空间的首地址
void *realloc(void *ptr, size_t size);//动态内存调整,将地址为ptr的空间的大小改变为size个字节,并返回新的空间的首地址
使用这三个函数动态分配的空间,最后一定一定要使用free()函数释放该段空间!!
这三个函数均返回一个void *类型的指针,在我们接收这个动态申请的空间时,
我们需要将void *类型转换为需要的类型。
int*pn=(int*)malloc(5*sizeof(int));
pn=(int*)realloc(pn,10*sizeof(int));
realloc()函数的原理是,如果在原空间紧接着的空间能满足新空间的大小,则直接在原空间后只见增加空间大小,否则会新生成一个符合大小的新空间,并将原空间的内容复制到新空间上。
更多推荐
所有评论(0)