C语言-void类型作为万能指针类型

举报
DS小龙哥 发表于 2021/11/29 22:48:04 2021/11/29
【摘要】 void类型在基本数据类型里是`空类型`,`无类型`; void类型常用来当做函数的返回值,函数形参声明,表示函数没有返回值,没有形参。 void类型不能用来定义变量,因为它是空类型--`可以理解为空类型`。 void abc; //这是错误的 但是`void`是可以定义指针的,`void*`表示万能型指针类型,可以与任何指针类型进行转换,特别是内存拷贝里用的很多。

1. 前言

void类型在基本数据类型里是空类型无类型;

void类型常用来当做函数的返回值,函数形参声明,表示函数没有返回值,没有形参。

void类型不能用来定义变量,因为它是空类型–可以理解为空类型

void abc;  //这是错误的

但是void是可以定义指针的,void*表示万能型指针类型,可以与任何指针类型进行转换,特别是内存拷贝里用的很多。

2. 内存拷贝函数 memcpy

系统提供函数: 内存拷贝函数

#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;
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。