1. 前言
void类型在基本数据类型里是空类型
,无类型
;
void类型常用来当做函数的返回值,函数形参声明,表示函数没有返回值,没有形参。
void类型不能用来定义变量,因为它是空类型–可以理解为空类型
。
void abc; //这是错误的
但是void
是可以定义指针的,void*
表示万能型指针类型,可以与任何指针类型进行转换,特别是内存拷贝里用的很多。
系统提供函数: 内存拷贝函数
#include <string.h> void *memcpy(void *dest, const void *src, size_t n);
**示例代码:**memcpy函数过程
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc,char **argv) { char str1[]="1234567890"; char str2[100]; int int_a[]={1,2,3,4,5,6,7,8,9,0}; int int_b[10]; int a=200; int b; int i; //拷贝字符串数组 memcpy(str2,str1,sizeof(str1)); printf("str1=%s\n",str1); printf("str2=%s\n",str2); //拷贝整数数组 memcpy(int_b,int_a,sizeof(int_a)); for(i=0;i<10;i++) { printf("%d ",int_a[i]); } printf("\n"); for(i=0;i<10;i++) { printf("%d ",int_b[i]); } printf("\n"); //拷贝变量 memcpy(&b,&a,sizeof(a)); printf("a=%d\n",a); printf("b=%d\n",b); return 0; }
3. 自己编写memcpy函数
#include <stdio.h> #include <stdlib.h> #include <string.h> void my_memcpy(void *p1,const void *p2,int cnt); int main(int argc,char **argv) { char str1[]="1234567890"; char str2[100]; int int_a[]={1,2,3,4,5,6,7,8,9,0}; int int_b[10]; int a=200; int b; int i; //拷贝字符串数组 my_memcpy(str2,str1,sizeof(str1)); printf("str1=%s\n",str1); printf("str2=%s\n",str2); //拷贝整数数组 my_memcpy(int_b,int_a,sizeof(int_a)); for(i=0;i<10;i++) { printf("%d ",int_a[i]); } printf("\n"); for(i=0;i<10;i++) { printf("%d ",int_b[i]); } printf("\n"); //拷贝变量 my_memcpy(&b,&a,sizeof(a)); printf("a=%d\n",a); printf("b=%d\n",b); return 0; } /* 内存拷贝函数 */ void my_memcpy(void *p1,const void *p2,int cnt) { char *str1=(char*)p1; char *str2=(char*)p2; int i; for(i=0;i<cnt;i++) { *str1=*str2; str1++; str2++; } }
4. 内存初始化函数: memset
memset函数常用于内存空间初始化,可以给空间赋初始值。
#include <string.h> //void *memset(void *s, int c, size_t n); //函数功能: 将指定空间赋值为指定的值。 #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc,char **argv) { int int_b[10]; int b; int i; //memset(void *s, int c, size_t n); memset(int_b,0,sizeof(int_b)); //拷贝整数数组 for(i=0;i<10;i++) { printf("%d ",int_b[i]); } printf("\n"); //拷贝变量 memset(&b,0,sizeof(int_b)); printf("b=%d\n",b); return 0; }
5. 自己编写memset
#include <stdio.h> #include <stdlib.h> #include <string.h> void my_memset(void *p,int c,int n); int main(int argc,char **argv) { int int_b[10]; int b; int i; //memset(void *s, int c, size_t n); my_memset(int_b,0,sizeof(int_b)); //拷贝整数数组 for(i=0;i<10;i++) { printf("%d ",int_b[i]); } printf("\n"); //拷贝变量 my_memset(&b,0,sizeof(int_b)); printf("b=%d\n",b); return 0; } void my_memset(void *p,int c,int n) { char *str=(char*)p; int i; for(i=0;i<n;i++) { *str=c; str++; } }
6. 读写int类型数据到文件
在文件读写中,经常需要向文件里读写自定义数据。
#include <stdio.h> #include <string.h> int write_file(); int read_file(); int main(int argc,char **argv) { write_file(); read_file(); return 0; } int write_file() { int cnt; int a=123; /*1. 打开文件*/ FILE *fp=fopen("test.txt","wb"); if(fp==NULL) { printf("文件打开失败.\n"); return -1; } /*2. 写入数据*/ cnt=fwrite(&a,1,sizeof(a),fp); printf("成功写入%d字节",cnt); /*3. 关闭文件*/ fclose(fp); return 0; } int read_file() { int cnt; int a; /*1. 打开文件*/ FILE *fp=fopen("test.txt","rb"); if(fp==NULL) { printf("文件打开失败.\n"); return -1; } /*2. 读取数据*/ cnt=fread(&a,1,sizeof(a),fp); printf("成功读取%d字节\n",cnt); printf("a=%d\n",a); /*3. 关闭文件*/ fclose(fp); return 0; }