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;
}
目录
相关文章
|
8天前
|
存储 C语言
【C语言基础】一篇文章搞懂指针的基本使用
本文介绍了指针的概念及其在编程中的应用。指针本质上是内存地址,通过指针变量存储并间接访问内存中的值。定义指针变量的基本格式为 `基类型 *指针变量名`。取地址操作符`&`用于获取变量地址,取值操作符`*`用于获取地址对应的数据。指针的应用场景包括传递变量地址以实现在函数间修改值,以及通过对指针进行偏移来访问数组元素等。此外,还介绍了如何使用`malloc`动态申请堆内存,并需手动释放。
|
11天前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
|
17天前
|
存储 安全 C语言
C语言 二级指针应用场景
本文介绍了二级指针在 C 语言中的应用,
|
1月前
|
存储 编译器 C语言
【C语言篇】深入理解指针2
代码 const char* pstr = "hello world."; 特别容易让初学者以为是把字符串 hello world.放 到字符指针 pstr ⾥了,但是本质是把字符串 hello world. 首字符的地址放到了pstr中。
|
20天前
|
存储 安全 Go
深入理解 Go 语言中的指针类型
【8月更文挑战第31天】
8 0
|
1月前
|
C语言
【C语言】指针速览
【C语言】指针速览
16 0
|
编译器 C语言 开发者
【C 语言】数据类型本质 ( void 关键字作用 | 数据类型封装 | 作为 参数 或 返回值 代表无 | void* 指针赋值与被赋值 | void 类型变量不存在 )
【C 语言】数据类型本质 ( void 关键字作用 | 数据类型封装 | 作为 参数 或 返回值 代表无 | void* 指针赋值与被赋值 | void 类型变量不存在 )
270 0
|
8天前
|
存储 Serverless C语言
【C语言基础考研向】11 gets函数与puts函数及str系列字符串操作函数
本文介绍了C语言中的`gets`和`puts`函数,`gets`用于从标准输入读取字符串直至换行符,并自动添加字符串结束标志`\0`。`puts`则用于向标准输出打印字符串并自动换行。此外,文章还详细讲解了`str`系列字符串操作函数,包括统计字符串长度的`strlen`、复制字符串的`strcpy`、比较字符串的`strcmp`以及拼接字符串的`strcat`。通过示例代码展示了这些函数的具体应用及注意事项。
|
11天前
|
存储 C语言
C语言程序设计核心详解 第十章:位运算和c语言文件操作详解_文件操作函数
本文详细介绍了C语言中的位运算和文件操作。位运算包括按位与、或、异或、取反、左移和右移等六种运算符及其复合赋值运算符,每种运算符的功能和应用场景都有具体说明。文件操作部分则涵盖了文件的概念、分类、文件类型指针、文件的打开与关闭、读写操作及当前读写位置的调整等内容,提供了丰富的示例帮助理解。通过对本文的学习,读者可以全面掌握C语言中的位运算和文件处理技术。