C语言-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;
}
目录
相关文章
|
21天前
|
存储 C语言
【C语言基础】一篇文章搞懂指针的基本使用
本文介绍了指针的概念及其在编程中的应用。指针本质上是内存地址,通过指针变量存储并间接访问内存中的值。定义指针变量的基本格式为 `基类型 *指针变量名`。取地址操作符`&`用于获取变量地址,取值操作符`*`用于获取地址对应的数据。指针的应用场景包括传递变量地址以实现在函数间修改值,以及通过对指针进行偏移来访问数组元素等。此外,还介绍了如何使用`malloc`动态申请堆内存,并需手动释放。
|
24天前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
|
6天前
|
存储 Go
Go: struct 结构体类型和指针【学习笔记记录】
本文是Go语言中struct结构体类型和指针的学习笔记,包括结构体的定义、成员访问、使用匿名字段,以及指针变量的声明使用、指针数组定义使用和函数传参修改值的方法。
|
29天前
|
存储 安全 C语言
C语言 二级指针应用场景
本文介绍了二级指针在 C 语言中的应用,
|
2月前
|
存储 安全 Go
深入理解 Go 语言中的指针类型
【8月更文挑战第31天】
13 0
|
2月前
|
C语言
【C语言】指针速览
【C语言】指针速览
18 0
|
5月前
|
C语言
C语言---指针进阶
C语言---指针进阶
42 0
|
10月前
|
C语言
C语言指针进阶(下)
C语言指针进阶(下)
54 1
|
10月前
|
编译器 C语言
C语言指针进阶(上)
C语言指针进阶(上)
98 1
|
10月前
|
C语言
C语言指针进阶(中)
C语言指针进阶(中)
44 0
下一篇
无影云桌面