开发者社区> DS小龙哥> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

简介: C语言-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;
}


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
《C语言程序设计》一 2.3 运算符和表达式
本节书摘来自华章出版社《C语言程序设计》一 书中的第2章,第2.3节,作者:赵宏 陈旭东 马迪芳,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1086 0
《C语言程序设计》一 2.5 案例学习——华氏温度与摄氏温度的转换
本节书摘来自华章出版社《C语言程序设计》一 书中的第2章,第2.5节,作者:赵宏 陈旭东 马迪芳,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
880 0
【C语言】C语言之深入指针进阶(建议收藏以备不时之需)
【C语言】C语言之深入指针进阶(建议收藏以备不时之需)
0 0
【C语言】C语言之深入指针进阶(建议收藏以备不时之需)(二)
🗽初阶指针请点击此跳转 https://blog.csdn.net/DerrickWestbrook/article/details/117787490. 指针的主题,在上述链接文章中已经解释过了,我们已经知道了指针的概念: 指针就是个变量,用来存放地址,地址唯一标识一块内存空间。 指针的大小是固定的4/8个字节(32位平台/64位平台)。 指针是有类型的,指针的类型决定了指针的±整数的步长,指针解引用操作的时候的权限。 在本篇文章将继续讲解质指针的高级主题
0 0
C语言——指针的进阶
这是学习C语言指针进阶知识的文章
0 0
C语言——指针进阶终章
战至终章哈哈,加油
0 0
C语言——指针的进阶(上)
C语言——指针的进阶(上)
0 0
C语言——指针的进阶(中)
C语言——指针的进阶(中)
0 0
C语言——指针的进阶(下)
C语言——指针的进阶(下)
0 0
+关注
DS小龙哥
嵌入式工程师
文章
问答
文章排行榜
最热
最新
相关课程
更多
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载